C++20继承构造函数无需using声明?是标准特性还是VS2019独有?
问题解答
核心结论
你观察到的无需显式写using声明即可继承基类构造函数的行为,是微软MSVC编译器的独有非标准扩展,不属于C++20官方引入的标准特性。
C++标准规则说明
自C11正式引入继承构造函数特性以来,包括C20、C++23在内的所有后续标准,都始终遵循以下规则:
- 派生类默认不会隐式继承基类的构造函数
- 只有显式添加
using 基类类名::基类类名;声明,才会将基类的构造函数引入派生类作用域,允许直接使用基类的构造函数签名初始化派生类对象
你给出的第二段带using Base::Base;的代码,是符合所有C++11及更高版本标准的正规实现方式。
MSVC行为说明
MSVC默认开启了大量用于兼容老版本代码的非标准扩展,即便你指定了/std:c++latest编译选项,这些扩展也不会默认关闭。如果你添加/permissive-编译选项强制MSVC严格遵循C++标准,你给出的第一段没有using声明的代码会直接编译报错,和GCC、Clang等其他标准兼容编译器的行为完全一致。
内容的提问来源于stack exchange,提问作者ewq468
相关产品推荐
相关产品推荐

