在c ++ 11中使用`someType()`无法初始化哪些临时值?

eud*_*xos 4 c++ initialization c++11

我有一些宏对类型和初始值进行操作.我需要的初始值转换vInivType(vIni总是转换为vType,有时它具有相同的类型).在vIni可能是空的,以及,在这种情况下vType,应未初始化或默认初始化.reult传递给模板化函数.

简而言之,

template<typename T> void foo(const T& o);

foo(vType(vIni));
foo(vType());
Run Code Online (Sandbox Code Playgroud)

必须编译.

我已经发现foo(unsigned int())foo(int*())不会编译,但它可以使用typedef解决.

什么是其他情况(除了带有空格和指针的内置类型)会失败?

Ste*_*sop 5

简短(略微过于简化)的答案是,"除了简单类型说明符之外,它将失败".

5.2.3/1说:

简单型SPECI音响ER(7.1.6.2)或类型名称-SPECI音响ER后跟带括号的(14.6)表达式列表构建体给出的表达式列表中的SPECI音响ED类型的值.

简单型说明符可以是用于一种类型的一个字的名称(任选再加上一些::东西的范围,和/或模板它们本身不必是简单类型说明符参数)或decltype表达.可能性列于7.1.6.2.

unsigned intint*不是简单类型说明符.任何复合类型说明符都将失败,因此cv-qualification,数组类型,函数类型,指针类型(包括指向函数的指针和指向成员的指针)都需要typedef.

也排除了是多字类型标识符一样unsigned char,long double.对于你的第一个例子,unsigned将代替unsigned int.

类型名称说明符是前面有一个类型typename,在模板用来断言一个从属名称确实是一个类型,而不是一个数据成员或成员函数.

最后当然,一旦你超越了这个限制,类型必须实际上是可构造的或可以从表达式列表中转换.因此,例如,您无法使用此语法或任何其他语法创建临时函数类型.