MSVC拒绝使用基类别名的委托构造函数是否符合C++标准?
使用
peak别名的写法是否符合C++标准? 这段代码可通过g++ 14.2和clang++ 18.1编译,但在MSVC 17.10中编译失败:
class Base { public: using peak = Base; Base() = default; }; class Derived : public Base { protected: using Base::peak; public: Derived() : peak() { } // MSVC拒绝编译 }; int main() { Derived d1{}; }
MSVC报错信息:
error C2437: 'peak': has already been initialized error C2437: 'peak': has already been initialized
结论:原写法完全符合C++标准,是MSVC存在编译bug
具体分析:
using Base::peak;的作用是将基类Base中的类型别名peak引入到派生类Derived的作用域中,这是C++标准明确允许的类型别名继承方式。- 构造函数初始化列表里的
peak(),本质是通过别名调用基类Base的默认构造函数,用来初始化派生类中的基类子对象——这和直接写Base()是完全等价的合法语法。 - MSVC错误地将这个基类构造调用识别成了对某个成员的重复初始化,属于编译器自身的实现问题。
另外,当把using Base::peak;替换为using peak = Base::peak;时,相当于在派生类中重新定义了一个指向Base的类型别名,和原写法语义一致,因此三个编译器都能正常编译,这也进一步验证了原写法的合法性。
内容的提问来源于stack exchange,提问作者Pavitra_Dev24
相关产品推荐
相关产品推荐

