什么时候允许推导出initializer_list?

dar*_*une 4 c++ language-lawyer c++17

我知道有一些特殊的规则可以推断出initializer_list,但在发现以下内容之前我认为从来没有.什么时候可以推断或省略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
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/1sNcu4

T.C*_*.C. 12

这与演绎无关.语法?:需要所有三个操作数的实际表达式:

[expr.cond]:

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression
Run Code Online (Sandbox Code Playgroud)

撑-INIT列表不是表达式和根本无法与被使用?:.

  • @darune你不能指望每个人都试图帮助你写一篇关于这个主题的百科全书文章.看起来你比这更了解这个,或者至少你知道要找什么.答案简明扼要,总体上清楚.用标准和"今天"这样的陈述来扩展它,关于委员会正在发生的事情会使其混淆并降低其整体实用性.如果你想知道这一点,请问一个不同的问题. (4认同)
  • @darune更重要的是,你标记了这个问题`language-lawyer`.你有语言律师答案(字面意思).TC是啊,有点像专家. (4认同)
  • 虽然你的回答并不正确,但它非常稀疏 - 考虑到未来的用户来到这里.请举例说明为什么`const auto ascend = {1,2,3};`即使{1,2,3}不是表达式,也可以更新你的答案?还值得一提的是,它不是表达的唯一原因是因为委员会决定反对它以及未来可能会发生什么变化的可能性.谢谢. (2认同)
  • @JonHarper A*braced-init-list*不是声明.我想你可以把它称为初始化器. (2认同)