Sou*_*mar 39 c++ rvalue conditional-operator lvalue
很长一段时间以来,我认为三元运算符总是返回一个右值.但令我惊讶的是,事实并非如此.在下面的代码中,我没有看到返回值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 ;
}
Run Code Online (Sandbox Code Playgroud)
Som*_*ude 35
这两个i和j是glvalues(见这个值类参考了解详细信息).
然后,如果您阅读此条件运算符引用,我们就会到达这一点:
4)如果E2和E3是相同类型和相同值类别的glvalues,则结果具有相同的类型和值类别
因此结果(i < 3) ? i : j是glvalue,可以分配给.
但是做这样的事情真的不是我推荐的.
Sto*_*ica 20
有关这方面的规则详见[expr.cond].对于几种类型和值类别的组合,有许多分支.但最终,表达式是默认情况下的prvalue.第5段涵盖了您的示例中的案例:
如果第二个和第三个操作数是相同值类别的glvalues并且具有相同的类型,则结果是该类型和值类别,如果第二个或第三个操作数是位字段,则它是位字段,或者如果两者都是位字段.
无论i和j,是变量的名称,是类型的左值表达式int.因此条件运算符产生int左值.