C++中为何成员可使用类型别名,构造/析构函数却不行?
类类型别名在构造/析构函数中的使用限制解析
先看这段代码:
class Foo { public: using MyType = Foo; MyType* m = nullptr; // 编译通过 MyType* functor() { // 编译通过 return nullptr; } MyType() = default; // 编译报错 ~MyType() = default; // 编译报错 };
为什么成员变量/函数能用别名,构造/析构却不行?
- 对于成员变量、成员函数的返回值或参数来说,
MyType只是Foo的类型别名,编译器会将其等价于原始类名Foo处理,这些场景只需要识别类型,所以完全合法。 - 但C++标准对构造函数和析构函数有强制的命名规则:
- 构造函数的名字必须严格匹配类的原始标识符(也就是这里的
Foo),不能用类型别名、typedef名来替代。 - 析构函数的名字必须是
~加上类的原始标识符,同样不允许使用别名。
- 构造函数的名字必须严格匹配类的原始标识符(也就是这里的
- 编译器在解析构造/析构函数时,会直接查找与类原始名称完全一致的函数(析构则是
~加原始名称),不会去关联类型别名。所以代码里的MyType()和~MyType()会被编译器当成普通成员函数,但它们的命名又不符合构造/析构的要求,最终触发编译错误。
内容的提问来源于stack exchange,提问作者TwistedBlizzard
相关产品推荐
相关产品推荐

