{1,2}是值吗?如果是,它的类型是什么?如果不是,为什么可以将其分配给初始化列表?

xml*_*lmx 6 c++ types type-conversion initializer-list c++11

#include <initializer_list>

using namespace std;

template<class T>
void f(initializer_list<T>)
{}

int main()
{
    typeid(1);           // OK
    typeid(int);         // OK
    typeid(decltype(1)); // OK

    f({1, 2}); // OK

    typeid({1, 2});           // error
    decltype({1, 2}) v;       // error
    typeid(decltype({1, 2})); // error
}
Run Code Online (Sandbox Code Playgroud)

{1,2}是值吗?

如果是,为什么是typeid({1,2}); 不合法吗?

如果不是,为什么可以将它分配给initializer_list对象?

Pot*_*ter 4

  1. 不,它是一个没有内在价值的句法结构。它甚至(在语法上)不是一个表达式。但它可以用来初始化一个对象。

    运算typeid符需要正确的表达式,但函数参数不需要。当您传递函数参数时,实际上是在初始化参数对象。

  2. initializer_list可以通过这样的东西来初始化。数组也可以通过花括号初始化列表来初始化。该列表用于初始化通过initializer_list.

令人困惑的是,auto x = { 1, 2, 3 };Causesx被声明为std::initializer_list< int >. 这是一个auto与 不同的特殊例外decltype,并且已建议弃用。持久化 s 没有什么好的用途initializer_list