首页 > 解决方案 > 什么时候允许推导 initializer_list?

问题描述

我知道什么时候可以推导出 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
}

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

标签: c++language-lawyerc++17

解决方案


这与扣除无关。的语法?:需要所有三个操作数的实际表达式:

[expr.cond]

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

括号初始化列表不是表达式,根本不能与?:.


推荐阅读