从 class 派生的结构的初始化列表 (C++)
Initializer list for struct deriving from class (C++)
你能告诉我下面的例子有什么问题吗?我正在使用 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
不是聚合,因为它有一个包含虚拟成员的基础 class。
代码在Base
中去掉虚析构函数并使用C++17
时编译运行。
如果 Base
需要虚拟析构函数,Derived
可以实现自定义构造函数,允许使用大括号进行初始化。
class Base {
public:
virtual ~Base() = default;
};
struct Derived : public Base {
Derived(int m): m1(m) {}
int m1;
};
int main() {
Derived d{ 1 };
return 0;
}
你能告诉我下面的例子有什么问题吗?我正在使用 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
不是聚合,因为它有一个包含虚拟成员的基础 class。
代码在Base
中去掉虚析构函数并使用C++17
时编译运行。
如果 Base
需要虚拟析构函数,Derived
可以实现自定义构造函数,允许使用大括号进行初始化。
class Base {
public:
virtual ~Base() = default;
};
struct Derived : public Base {
Derived(int m): m1(m) {}
int m1;
};
int main() {
Derived d{ 1 };
return 0;
}