可以使用typedef名称来声明或定义构造函数吗?

bam*_*s53 14 c++ language-lawyer

Standardese:

[class.ctor] 12.1/1说

特殊的声明符语法用于声明或定义构造函数.语法使用:

    - 一个可选的decl-specifier-seq,其中每个decl-specifier都是一个函数说明符constexpr,

    - 构造函数的类名,和

    - 参数列表

以该顺序.

[class.name] 9.1/4说

命名类类型或其cv限定版本的typedef-name(7.1.3)也是类名.如果在需要类名的地方使用命名cv限定类类型的typedef-name,则忽略cv限定符.甲的typedef名称不应被用作 标识符在一个类头.

另外[expr.prim.general] 5.1.1/8说

在使用class-name :: class-name且两个类名引用同一个类的情况下,此表示法命名构造函数(12.1).


应用:

在我看来,应该允许使用typedef名称来声明构造函数(尽管事实上12.1/1不使用斜体类名).

例如,给定:

struct Foo;
typedef Foo Bar;
Run Code Online (Sandbox Code Playgroud)

然后

struct Foo { Bar() {} }; // defines Foo's constructor. - 1
Run Code Online (Sandbox Code Playgroud)

或者代之以

struct Foo;
struct Foo { Foo() };
typedef Foo Bar;
Run Code Online (Sandbox Code Playgroud)

然后

Foo::Bar() {}; // defines Foo's constructor - 2
Run Code Online (Sandbox Code Playgroud)

要么

Bar::Bar() {}; // defines Foo's constructor - 3
Run Code Online (Sandbox Code Playgroud)

要么

Bar::Foo() {}; // defines Foo's constructor - 4
Run Code Online (Sandbox Code Playgroud)

任何这些都应该是合法的.然而,似乎没有人接受定义2或3,MSVC接受1,MSVC,clang和gcc都接受4.

我的分析是否正确,所有这些编译器都错了吗?

Phi*_*ipp 14

§12.1/ 3 的工作草案N3337(2012年2月)指出

一个typedef的名称,不得用作类名说明符-ID的构造函数声明.

这排除了(1).

§12.1/ 1似乎对声明和定义使用术语"声明":

特殊的声明符语法用于声明或定义构造函数.[......]在这样的声明中,[...]

(没有明确提及"定义").我认为这是否适用于类外定义或仅适用于内联定义有点不清楚.如果它适用于所有类型的定义,这也将排除(2)和(3).(4)在任何情况下都应合法.