You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:22:10