C++ 何时允许推导初始值设定项列表?

C++ 何时允许推导初始值设定项列表?,c++,language-lawyer,c++17,C++,Language Lawyer,C++17,我知道有一些特殊的规则来规定何时可以推导出初始值设定项列表,但在发现以下内容之前,我一直认为这是不可能的。可以推断或省略初始值设定项列表时的规则是什么 下面的例子似乎不合逻辑,感觉像是语言缺陷 #include <initializer_list> void test() { bool reverse = true; const auto ascend = {1,2,3};//OK : seems to deduce to std::initializer_list

我知道有一些特殊的规则来规定何时可以推导出初始值设定项列表,但在发现以下内容之前,我一直认为这是不可能的。可以推断或省略初始值设定项列表时的规则是什么

下面的例子似乎不合逻辑,感觉像是语言缺陷

#include <initializer_list>

void test() {
    bool reverse = true;
    const auto ascend = {1,2,3};//OK : seems to deduce to std::initializer_list<const int>

    //const auto a_or_d_AUTO = reverse ? {3,2,1} : {1,2,3};//not ok, why ?

    const auto i = reverse ? 3 : 1;// also fine

    const auto a_or_d = reverse ? std::initializer_list<const int>({3,2,1}) : std::initializer_list<const int>({1,2,3});//also OK
}
#包括
无效测试(){
布尔反向=真;
const auto ascend={1,2,3};//确定:似乎推导到std::initializer\u列表
//const auto a_或_d_auto=reverse?{3,2,1}:{1,2,3};//不好,为什么?
const auto i=reverse?3:1;//也可以
const auto a_或d=reverse?std::initializer_list({3,2,1}):std::initializer_list({1,2,3});//也可以
}

这与扣减无关。
?:
的语法要求所有三个操作数都使用实际表达式:

:


大括号的init列表不是一个表达式,不能与
?:

一起使用,虽然您的答案没有错误,但它非常稀疏-考虑到未来的用户会来到这里。例如,请用why
const auto ascend={1,2,3}更新您的答案也可以吗?此外,值得一提的是,它不是一个表达的唯一原因是委员会决定反对它,如果有的话,将来可能会发生什么变化。谢谢。@darune你不能指望每个人都能帮你写一篇关于这个主题的百科全书文章。看起来你知道的比你透露的要多,或者至少你知道该找什么。答案简明扼要,整体清晰。用standardeze和类似“今天”的关于委员会中正在发生的事情的陈述来扩展它,会将其混为一谈,并降低其整体效用。如果你想知道这一点,可以问另一个问题。@darune更切题一点,你把这个问题标记为
语言律师
。你得到了一个语言律师的回答(字面意思)。T.C.是,啊,有点像专家。标准中引用的部分是。括号内的init列表是一个声明,而不是一个表达式(请参阅和)。@JonHarper括号内的init列表不是一个声明。我想你可以称之为初始值设定项。
conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression