提问者:小点点

为什么Clang和MSVC不喜欢带有多余括号的成员typedef声明?


考虑

using foo = int;

struct A {
    typedef A (foo)();
};

GCC和ICC接受该代码段,而Clang和MSVC拒绝该代码段。Clang的错误消息是

<source>:4:15: error: function cannot return function type 'void ()'
    typedef A (foo)();
              ^
<source>:4:13: error: typedef name must be an identifier
    typedef A (foo)();
            ^
2 errors generated.

MSVC说

<source>(4,15): error C2091: function returns function
    typedef A (foo)();
              ^

(现场演示)

为什么Clang和MSVC会产生这个错误?哪些编译器是正确的?


共1个答案

匿名用户

当您在a中重新声明foo时,将其含义从int更改为a()。这违反了basic.scope.class#2:

类S中使用的名称N应在其上下文中引用相同的声明,并且当在S的完整范围中重新评估时,不需要对违反此规则的情况进行诊断。

因为这是IFNDR,所以所有编译器都符合。