为什么typedef(typedef int * pt)可以使pt()发生?

时间:2014-08-26 06:11:18

标签: c++

我写了以下代码:

typedef int* pt;
pt p = pt();    // compile ok

int* p = (int*)()   // compile fail.

我想弄明白为什么?它们之间有什么不同?

1 个答案:

答案 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