MSVC 拒绝使用从基类采用的基类别名委托构造函数

问题描述 投票:0回答:2

以下代码使用 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
,则所有三个编译器的编译都会成功。

c++ visual-c++ language-lawyer using delegating-constructor
2个回答
2
投票

该程序是格式良好。这可以从明确允许这样做的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:

MSVC 拒绝涉及使用 mem-initializer-list 中使用的别名声明的有效程序


-2
投票

我认为这是编译器的问题而不是 vs code 的问题。

类型别名已在 C++11 阅读本文

可能您正在使用旧版本的 c++ 或其他版本。

© www.soinside.com 2019 - 2024. All rights reserved.