考虑
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会产生这个错误?哪些编译器是正确的?
当您在a
中重新声明foo
时,将其含义从int
更改为a()
。这违反了basic.scope.class#2:
类S中使用的名称N应在其上下文中引用相同的声明,并且当在S的完整范围中重新评估时,不需要对违反此规则的情况进行诊断。
因为这是IFNDR,所以所有编译器都符合。