【发布时间】:2022-01-21 21:28:12
【问题描述】:
你能告诉我下面的例子有什么问题吗?我正在使用 C++17,我认为应该支持以下内容。
class Base {
public:
virtual ~Base() = default;
};
struct Derived : public Base {
int m1;
};
int main() {
/* Results in a compilation error
* error C2440: 'initializing': cannot convert from 'initializer list' to 'Derived'
* message : No constructor could take the source type, or constructor overload resolution was ambiguous */
Derived d{ {},1 };
return 0;
}
【问题讨论】:
-
Derived不是聚合,因为它有一个带有虚拟成员的基类。所以它不能被初始化为一个聚合。 -
移除 Base 中的虚拟析构函数确实会导致同样的编译错误,为什么会这样? (我想这将是一个危险的解决方案......)
-
您使用哪个版本的 MSVC?您是否尝试过显式设置 C++17 模式 (
/std:c++17)? -
谢谢,现在可以使用了!我需要添加
set(CMAKE_CXX_STANDARD 17)和set(CMAKE_CXX_STANDARD_REQUIRED ON)以将其显式设置为 C++ 17 并删除 Base 中的虚拟析构函数。我将使用 Derived 的 shared_ptrs 并将它们作为 Base 的 shared_ptrs 传递。我想为此我需要明确地实现一个构造函数来使用初始化列表? -
其实你不需要需要
std::initializer_list构造函数。如果您声明一个,编译器应该选择正确的构造函数。然后你不需要在d的定义中初始化基类:Derived d{1};(带有合适的Derived(int)构造函数)就足够了。
标签: c++ inheritance struct initializer-list