Kai*_*Kai 7 c++ reference ternary-operator
以下C++无效,因为引用变量需要初始值设定项:
int& a; // illegal
if (isfive) {
a = 5;
} else {
a = 4;
}
Run Code Online (Sandbox Code Playgroud)
但是,MSVC似乎认为这没关系:
int& a = isfive ? 5 : 4;
Run Code Online (Sandbox Code Playgroud)
这意味着MSVC实际上将条件运算符视为单个表达式,而不是将其扩展为if-else语句.
使用条件运算符初始化引用始终是有效的C++吗?
三元运算符不会扩展为if-else构造(不是根据语言,实现可能会生成等效的二进制文件,但在语言级别它们是不同的).所以以下代码是有效的:
int four = 4, five = 5;
int& r = condition? four : five;
Run Code Online (Sandbox Code Playgroud)
问题中的原始示例取决于Microsoft扩展(错误地)允许将非const引用绑定到rvalue表达式.
MSVC有一个非标准的"扩展".这意味着它允许破坏代码.这是被禁止的一个很好的理由.
另请注意
int& a = 5;
Run Code Online (Sandbox Code Playgroud)
在标准C++中也不合法.
但是,一般情况下,const使用任何可以转换为正确类型的表达式初始化引用是合法的(包括使用条件运算符).const使用正确类型的左值初始化非引用是合法的,条件运算符在某些条件下会产生该值.
您发布的代码无法使用 VC++ 2010 进行编译:
错误 1 错误 C2440:“初始化”:无法从“int”转换为“int &”
将行更改为:
const int& a = isfive ? 5 : 4;
Run Code Online (Sandbox Code Playgroud)
使其编译。