我写了以下代码:
typedef int* pt;
pt p = pt(); // compile ok
但
int* p = (int*)() // compile fail.
我想弄明白为什么?它们之间有什么不同?
答案 0 :(得分:5)
首先,功能强制转换表示法中不允许使用额外的括号。例如
int i1 = int (); // compiles
int i2 = (int)(); // doesn't compile
但即使省略括号
,您的示例也无法编译int* p = int*(); // doesn't compile
这是因为函数强制转换表示法要求类型名称为简单类型说明符或 typename-specifier 。
§5.2.3[expr.type.conv]
1 简单类型说明符(7.1.6.2)或 typename-specifier (14.6)后跟带括号的表达式列表给定表达式列表构造指定类型的值。
...
2 表达式T()
,其中T
是简单类型说明符或 typename-specifier 表示非-array完整对象类型或(可能是cv限定的)void
类型,创建指定类型的prvalue,其值是由值初始化(8.5)类型为T
的对象生成的;没有为void()
情况进行初始化。
simple-type-specifier 基本上是指由单个单词组成的类型名称。由于同样的原因,以下行无法编译
unsigned int i = unsigned int(); // doesn't compile