C++ 为什么大括号的init list不能用在三元运算符中?
我的编译器是最新的VC++2013 RCC++ 为什么大括号的init list不能用在三元运算符中?,c++,visual-c++,c++11,initialization,ternary-operator,C++,Visual C++,C++11,Initialization,Ternary Operator,我的编译器是最新的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 : '{' } 为什么大括号的init list不能用在三元运算
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 : '{'
}
为什么大括号的init list不能用在三元运算符中
<强>这个行为是否被C++标准定义为不正确的,或者只是VC++编译器的一个bug?< /强>
< p>,下面是标准的关于支持init列表(85.3.1):的内容。 列表初始化 可以使用- 作为变量定义中的初始值设定项(8.5)
- 作为新表达式中的初始值设定项(5.3.4)
- 在返回语句中(6.6.3)
- 作为函数参数(5.2.2)
- 作为下标(5.2.1)
- 作为构造函数调用的参数(8.5、5.2.3)
- 作为非静态数据成员的初始值设定项(9.2)
- 在mem初始值设定项中(12.6.2)
- 在作业的右侧(5.17)
因为这没有提到条件运算符,我想你的编译器是对的。还要注意,条件运算符要求表达式位于
:
(5.16)的两侧,据我所知,大括号初始值设定项不是表达式。这是语法错误。大括号的init列表不是表达式,也没有类型或值类别。支持的init列表在C++语法的不同位置可用,条件表达式的操作数不是这些位置的一个。因此,您的代码甚至无法解析
如果要执行此操作,请执行以下操作:
struct T { ... };
T f(bool b)
{
return b ? {i,j,k} : {x,y};
}
相反,您可以这样做:
T f(bool b)
{
return b ? T{i,j,k} : T{x,y};
}
我相信,虽然这需要一个移动构造函数,但它不会使用它,RVO也会起作用
或者,您当然可以这样做:
T f(bool b)
{
if (b)
return {i,j,k};
else
return {x,y};
}
要获得列表初始化的所有优点。
{}
不是一个表达式,请在这里使用统一初始化检查语法,应该可以执行返回b?{0}:{1}
据我所知。@Rapptz,返回b?{0}:{1}也被拒绝。@xmlmx是的,你说得对。它不适用于内置类型。语法错误是由于<代码>:运算符,但不是因为<代码>返回< /代码>,所以考虑条件运算符的语法。表达式是“一个运算符和操作数指定一个计算序列”(即C++标准中给出的定义)<如果代码没有接受这些参数的构造函数,则代码> t(i,j,k)< /> >将不起作用。code>T{i,j,k}就可以了