#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对象?
-
不,它是一个没有内在价值的句法结构。它甚至不是(语法上)一个表达式。但它可用于初始化对象。
typeid
运算符需要正确的表达式,但函数参数不需要。传递函数参数时,实际上是在初始化参数对象。 -
initializer_list
可以通过这样的事情初始化。数组也可以通过大括号初始值设定项列表进行初始化。该列表用于初始化通过initializer_list
访问的数组。
令人困惑的是,auto x = { 1, 2, 3 };
导致x
被声明为std::initializer_list< int >
。这是一个特殊的例外,auto
与decltype
不同,并且已被提议弃用。持久initializer_list
很少有好的用途。
typeid
需要一个表达式
在这里形成表格
typeid
表达式是 lvalue 表达式,它指的是多态类型的静态对象const std::type_info
或派生自它的某种类型。
语法: 类型( 表达式 )
检查表达式表达式
-
TypeID 表达式计算表达式,然后引用表示表达式的动态类型的
std::type_info
对象。 -
如果表达式不是多态类型的 glvalue 表达式,则 typeid 不会计算表达式,它标识的
std::type_info
对象表示表达式的静态类型。