2017-08-04 146 views
4

样品的编号:意义的I(I())

typedef int I; 
struct X{ X(int); }; 

int main() 
{ 
    int(int()); 
    X(X()); 
    I(I()); 
} 

线int(int());是使用功能性的转换符号的表达 - 这是与初始化的临时int的值初始化int

X(X());是一个名为X的函数的声明,它不返回返回struct X的参数。

我的问题是:这里的I(I())是什么意思?标准中的哪些规则决定了这三种情况之间的意义差异?

+1

'typedef int I'使得'I'的行为*完全像'int'。它只是分配另一个名字。因此,行I(I())和int(int())具有完全相同的含义。有关'typedef'的更多信息,请参见[[dcl.typedef](https://timsong-cpp.github.io/cppwp/dcl.typedef)]。 –

+0

根据gcc/clang,它和'X'一样,函数'I'的声明返回'int'。 – Jarod42

+1

所有3个都是函数decl – Sopel

回答

3

该规则指出,如果一个构造对于一个声明或一个声明来说语义不明确,那么它就被认为是一个声明。

[stmt.ambig] 1有一个在语法涉及表达语句和声明的歧义:一个expression- 语句与函数式明确的类型转换(5.2.3),作为其最左边的子表达式可以是从声明中无法分辨的 tinguishable其中第一个声明符用(在这种情况下该语句是一个 声明开始。

X(X());是模糊的,因为它可以是一个演员,或者一个函数声明,所以它被认为是一个声明。

int(int());不能是函数声明,因为作为关键字的int不是函数的有效名称。所以,没有歧义,这是一个演员。

同样,I(I());不能是一个函数声明,因为虽然不是关键字,I是不是一个有效的名称可能是因为它会重新声明为一个函数,这是不允许的类型I,因此它是一个演员。

+0

你在说什么'我(我());'然后准确地说? –

+0

@ M.M正如我理解的规则,它是一个功能强大的转换,并且初始化值是临时的,就像'int(int())'一样。 – user2079303

+0

这可能是不允许重新定义typedef的规则:使用typedef说明符声明的名称变为typedef名称。在其声明的范围内,typedef-name在语法上等同于关键字和......。关键字可能不会被重新定义......但这似乎有点模糊。 – user2079303

相关问题