返回引用时的 C++ 三元运算符

Posted

技术标签:

【中文标题】返回引用时的 C++ 三元运算符【英文标题】:C++ Ternary operator when returning a reference 【发布时间】:2021-07-04 13:18:13 【问题描述】:

我了解到以下函数不起作用,因为 x 和 y 在 return 语句之后不在堆栈上。

int& max(int x, int y) 
    if (x < y) 
        return x;
     else 
        return y;
    

但是为什么像这样使用三元运算符时它会起作用?

int& max(int x, int y)  return (x > y ? x : y); 

【问题讨论】:

去掉()还能用吗? It doesn't. 仍然是未定义的行为,未定义行为的乐趣在于您的程序可以正常工作 我认为“工作”应该用引号引起来,因为我收到了warning: reference to stack memory associated with parameter 'x' returned [-Wreturn-stack-address] 看似工作不等于工作gcc.godbolt.org/z/4j755sWbh 【参考方案1】:

它不起作用,只是你的编译器没有抱怨。有时 C++ 会发现你做错了什么。其他时候你欺骗它,你的代码很糟糕。

未定义的行为,例如跟随一个悬空的引用,可以“看起来有效”。

【讨论】:

以上是关于返回引用时的 C++ 三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建对三元运算符结果的 const 引用是不是安全?

三元运算

在 C++ 三元运算符中使用字符串常量是对非左值数组的无效使用吗?

python lambda表达式与三元运算

?:将一个表达式留空时的三元条件运算符行为

C ++中的三元运算符奇怪的行为