6
#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
}

{1, 2} 是一个值吗?

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

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

4

2 回答 2

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

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

  2. initializer_list可以通过这样的事情来初始化。数组也可以通过花括号初始化器列表进行初始化。该列表用于初始化通过initializer_list.

令人困惑的是,auto x = { 1, 2, 3 };导致x被声明为std::initializer_list< int >. auto这是一个与 不同的特殊例外,decltype已被提议弃用。initializer_listpersistent s几乎没有什么好的用途。

于 2013-09-14T03:47:11.397 回答
0

typeid需要表达

在这里形成

typeid表达式是左值表达式,它引用多态类型const std::type_info或从它派生的某种类型的静态对象。

语法:typeid(表达式)

检查表达式表达式

  • typeid 表达式对表达式求值然后引用std::type_info表示表达式动态类型的对象。

  • 如果 expression 不是多态类型的泛左值表达式,则 typeid 不对表达式求值,std::type_info它标识的对象表示表达式的静态类型。

于 2013-09-14T03:49:36.900 回答