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


#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对象?

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

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

  2. initializer_list可以通过这样的事情初始化。数组也可以通过大括号初始值设定项列表进行初始化。该列表用于初始化通过 initializer_list 访问的数组。

令人困惑的是,auto x = { 1, 2, 3 };导致x被声明为std::initializer_list< int >。这是一个特殊的例外,autodecltype不同,并且已被提议弃用。持久initializer_list很少有好的用途。

typeid需要一个表达式

在这里形成表格

typeid表达式是 lvalue 表达式,它指的是多态类型的静态对象const std::type_info或派生自它的某种类型。

语法: 类型( 表达式 )

检查表达式表达式

  • TypeID 表达式计算表达式,然后引用表示表达式的动态类型的std::type_info对象。

  • 如果表达式不是多态类型的 glvalue 表达式,则 typeid 不会计算表达式,它标识的std::type_info对象表示表达式的静态类型。

最新更新