bam*_*s53 14 c++ language-lawyer
[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)在任何情况下都应合法.
| 归档时间: |
|
| 查看次数: |
2738 次 |
| 最近记录: |