C++ 为什么大括号的init list不能用在三元运算符中?

C++ 为什么大括号的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不能用在三元运算

我的编译器是最新的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不能用在三元运算符中


<强>这个行为是否被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}就可以了