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对象?
不,它是一个没有内在价值的句法结构。它甚至(在语法上)不是一个表达式。但它可以用来初始化一个对象。
运算typeid符需要正确的表达式,但函数参数不需要。当您传递函数参数时,实际上是在初始化参数对象。
initializer_list可以通过这样的东西来初始化。数组也可以通过花括号初始化列表来初始化。该列表用于初始化通过initializer_list.
令人困惑的是,auto x = { 1, 2, 3 };Causesx被声明为std::initializer_list< int >. 这是一个auto与 不同的特殊例外decltype,并且已建议弃用。持久化 s 没有什么好的用途initializer_list。