为什么C++利用三目运算符可以返回局部变量的引用?

为什么可以这样写:

#include <iostream>
#include <cstring>

using namespace std;

int & func(int a, int b)
{
    // 这里的a, b都是局部变量, 在函数中是不能返回局部变量的引用的
    // 但借助三目运算符为什么就可以返回局部变量的引用了?
    return a > b ? a : b;
}

int main()
{
    cout << func(5, 10) << endl;

    return 0;
}

当我在函数中直接 return 局部变量 ab的时候, 编译器会报错, 说返回了局部变量的引用是不可以的。 但如果我写成三目运算符的形式, 编译器就通过了。这是为什么?

阅读 3.2k
3 个回答

執行下面的代碼,你就會知道。返回局部變量的引用,會有很多不可預期的行爲。

#include <iostream>
using namespace std;

int & func1(int a, int b)
{
    return a > b ? a : b;
}

int & func2(int a, int b)
{
    return a < b ? a : b;
}

int main()
{
    int a = 5, b = 10;
    int& c = func1(a, b);
    int& d = func2(a, b);
    int& e = func1(a, b);
    cout << c << endl;
    cout << d << endl;
    cout << e << endl;

    return 0;
}

不可以这么写。
有没有三目运算符,都不可以返回局部变量的引用。

事实上,在语法层面,我们是可以做到返回局部对象的引用的。(有没有三目运算符都一样)

int& func(int a, int b)
{
    return a;
}

但是,通常我们都不会这么写,因为在函数调用结束后,函数内的局部变量已经不存在了(主要表现在,该片空间的地址可被其他程序使用,进而修改该片空间的值)。而函数返回引用,实质上与返回指针是相同的,他们都返回的是 函数内 局部变量所在的空间的 地址 或 值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题