【发布时间】:2019-07-08 08:46:14
【问题描述】:
长期以来,我一直认为三元运算符总是返回一个右值。但令我惊讶的是,事实并非如此。在下面的代码中,我看不出foo的返回值和三元运算符的返回值有什么区别。
#include <iostream>
int g = 20 ;
int foo()
{
return g ;
}
int main()
{
int i= 2,j =10 ;
foo()=10 ; // not Ok
((i < 3) ? i : j) = 7; //Ok
std::cout << i <<","<<j << "," <<g << std::endl ;
}
【问题讨论】:
-
附带说明,如果您将
int foo()更改为int &foo(),那么foo()=10;也可以使用。 -
“三元运算符总是返回一个右值。令人惊讶的是它确实” 你的意思是“不”,因为它可以返回左值(当双方都是左值时)。
-
另见stackoverflow.com/questions/1082655/…。如那里所述,您始终可以使用
*((i<3) ? &i : &j) = 7;,因此 C++ 规则可以概括为“即使没有*&,它仍然有效” -
在 C 中,条件运算符永远不会产生左值。在 C++ 中,有时会这样。这是人们应该避免提及“C/C++”的一个例子。像这样的各种细微差别可能最终与任何特定问题相关。
标签: c++ conditional-operator rvalue lvalue