I(I())的含义

4

示例代码:

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

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

代码行 int(int()); 使用函数转换符号,它是一个用零值初始化的临时整数。

代码行 X(X()); 声明了一个名为X的函数,不带参数并返回一个名为X的结构体。

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


1
typedef int I 使 I 的行为与 int 完全相同。它只是分配了另一个名称。因此,行 I(I())int(int()) 具有完全相同的含义。有关 typedef 的更多信息,请参见[dcl.typedef]。 - Henri Menke
根据gcc/clang,对于X来说,它是一个返回int的函数I的声明。 - Jarod42
1
所有三个都是函数声明。 - Sopel
1
@Sopel:错误。正如问题中明确说明的那样,第一个不是函数声明。int是关键字这一事实在第一个案例中有着至关重要的区别。 - AnT stands with Russia
抱歉,出了点问题,没有名字,你是对的。 - Sopel
我认为int不是一个有效的函数名称,与X/I相反。 - Jarod42
1个回答

3
规则规定,如果一个结构既可以是声明语句,也可以是语句,那么它被视为声明语句。
[stmt.ambig] 1 语法中涉及表达式语句和声明之间的歧义:以函数样式显式类型转换(5.2.3)作为最左子表达式的表达式语句可能无法区分与首个声明符以“(”开头的声明之间的差别。在这些情况下,该语句是一个声明。
X(X()); 是有歧义的,因为它既可以是强制类型转换,也可以是函数声明,所以它被视为声明语句。
int(int()); 不可能是函数声明,因为 int 是一个关键字,不能用作函数的名称。因此,不存在歧义,它是一个强制类型转换。
同样地,I(I()); 也不可能是函数声明,因为虽然 I 不是一个关键字,但它也不是一个有效的名称,因为它会将类型 I 重新声明为函数,而这是不允许的,因此它是一个强制类型转换。

你是想问 I(I()) 这段代码的确切含义吗? - M.M
据我理解,这是一个函数式转换和值初始化临时变量,就像 int(int()) 一样。 - eerorika
这可能是禁止重新定义typedef的规则:“使用typedef说明符声明的名称成为typedef名称。在其声明的范围内,typedef名称在语法上等同于关键字...”。关键字不能被重新定义...但这似乎有点模糊。 - eerorika
1
规则如下:http://eel.is/c++draft/basic.scope.declarative#4 仅当typedef位于与其他声明相同的声明区域中时,才适用此规则。如果其中一个在嵌套范围内,则不适用。此规则的目的是尽可能地禁止这种愚蠢行为,仅保持与C兼容(例如,具有名为“stat”的函数和结构体)。 - Brian Bi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接