使用条件运算符初始化引用变量

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++吗?

Dav*_*eas 9

三元运算符不会扩展为if-else构造(不是根据语言,实现可能会生成等效的二进制文件,但在语言级别它们是不同的).所以以下代码是有效的:

int four = 4, five = 5;
int& r = condition? four : five;
Run Code Online (Sandbox Code Playgroud)

问题中的原始示例取决于Microsoft扩展(错误地)允许将非const引用绑定到rvalue表达式.


Ben*_*igt 5

MSVC有一个非标准的"扩展".这意味着它允许破坏代码.这是被禁止的一个很​​好的理由.

另请注意

int& a = 5;
Run Code Online (Sandbox Code Playgroud)

在标准C++中也不合法.

但是,一般情况下,const使用任何可以转换为正确类型的表达式初始化引用是合法的(包括使用条件运算符).const使用正确类型的左值初始化非引用是合法的,条件运算符在某些条件下会产生该值.

  • 好吧,您知道什么,问这个问题解决了一个我什至不知道自己遇到的问题。谢谢! (2认同)

Nem*_*vic 5

您发布的代码无法使用 VC++ 2010 进行编译:

错误 1 ​​错误 C2440:“初始化”:无法从“int”转换为“int &”

将行更改为:

const int& a = isfive ? 5 : 4; 
Run Code Online (Sandbox Code Playgroud)

使其编译。