标准语:
[class.ctor] 12.1/1 说
特殊的声明符语法用于声明或定义构造函数。语法使用:
— 一个可选的decl-specifier-seq,其中每个decl-specifier是函数说明符或constexpr,
— 构造函数的类名,以及
— 参数列表
以该顺序。
[class.name] 9.1/4 说
命名类类型或其 cv 限定版本的typedef-name (7.1.3) 也是class-name。如果在需要类名的地方使用命名 cv 限定类类型的typedef - name ,则忽略 cv 限定符。typedef-name不应用作 class-head中的标识符。
[expr.prim.general] 5.1.1/8 还说
在使用class-name :: class-name的地方,并且两个 class-name 引用同一个类,此符号命名构造函数(12.1)。
应用:
在我看来,这似乎是说应该允许使用 typedef 名称声明构造函数(尽管 12.1/1 不使用斜体class-name)。
例如,给定:
struct Foo;
typedef Foo Bar;
然后
struct Foo { Bar() {} }; // defines Foo's constructor. - 1
或者改为给出
struct Foo;
struct Foo { Foo() };
typedef Foo Bar;
然后
Foo::Bar() {}; // defines Foo's constructor - 2
或者
Bar::Bar() {}; // defines Foo's constructor - 3
或者
Bar::Foo() {}; // defines Foo's constructor - 4
这些都应该是合法的。但是似乎没有人接受定义 2 或 3,MSVC 接受 1,MSVC、clang 和 gcc 都接受 4。
我的分析是否正确,所有这些编译器都错了吗?