以下代码使用 g++ 14.2 和 clang++ 18.1 进行编译,但使用 MSVC 17.10 (GodBolt)失败。
class Base {
public:
using peak = Base;
Base() = default;
};
class Derived : public Base {
protected:
using Base::peak;
public:
Derived() : peak() { } // rejected by MSVC
};
int main() {
Derived d1{};
}
MSVC 错误:
error C2437: 'peak': has already been initialized
error C2437: 'peak': has already been initialized
使用
peak
别名在 C++ 中有效吗?
注意:如果我们使用
using peak = Base::peak
而不是 using Base::peak
,则所有三个编译器的编译都会成功。
该程序是格式良好。这可以从明确允许这样做的class.base.init中看出:
mem-initializer-list 可以使用表示基类类型的 any
来初始化基类。class-or-decltype
class-or-decltype
包括 nested-name-specifieropt type-name
,其中 nested-name-specifier_opt
在我们的例子中将为空,并且 type-name
包括 typedef-name。
这是新提交的msvc bug: