xml*_*lmx 26 c++ initialization ternary-operator visual-c++ c++11
我的编译器是最新的VC++ 2013 RC.
int f(bool b)
{
return {}; // OK
return b ? 1 : { }; // C2059: syntax error : '{'
return b ? 1 : {0}; // C2059: syntax error : '{'
return b ? {1} : {0}; // C2059: syntax error : '{'
}
Run Code Online (Sandbox Code Playgroud)
为什么braced-init-list不能用于三元运算符?
这种行为是否被C++标准定义为不正确,或仅仅是VC++编译器的错误?
Sin*_*all 19
好吧,这是标准关于braced-init-list(8.5.3.1)的内容:
可以使用列表初始化
- 作为变量定义中的初始值设定项(8.5)
- 作为新表达式中的初始值设定项(5.3.4)
- 在一份回复声明中(6.6.3)
- 作为函数参数(5.2.2)
- 作为下标(5.2.1)
- 作为构造函数调用的参数(8.5,5.2.3)
- 作为非静态数据成员的初始化程序(9.2)
- 在mem-initializer中(12.6.2)
- 在作业的右侧(5.17)
由于这没有提到条件运算符,我猜你的编译器是正确的.另请注意,条件运算符需要:(5.16)两边的表达式,据我所知,大括号初始化器不是表达式.
这是一个语法错误.braced-init-list不是表达式,它没有类型或值类别.braced-init-list在C++语法的各个位置都可用,并且条件表达式的操作数不是这些位置之一.因此,您的代码甚至无法解析.
如果你想这样做:
struct T { ... };
T f(bool b)
{
return b ? {i,j,k} : {x,y};
}
Run Code Online (Sandbox Code Playgroud)
相反,你可以这样做:
T f(bool b)
{
return b ? T{i,j,k} : T{x,y};
}
Run Code Online (Sandbox Code Playgroud)
而且我相信,虽然这需要一个移动构造函数,但它不会使用它而RVO会启动.
或者你当然可以这样做:
T f(bool b)
{
if (b)
return {i,j,k};
else
return {x,y};
}
Run Code Online (Sandbox Code Playgroud)
获得列表初始化的所有优点.
| 归档时间: |
|
| 查看次数: |
1440 次 |
| 最近记录: |