C++20 中的自动构造函数继承[重复]

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

我只有这段代码,我想知道为什么这段代码可以在 C++20 及更高版本中编译,但不能在 C++17 及更早版本中编译。

struct B {
  B(int){};
};

struct D : B {
};

int main() {

  D d = D(10);

}

我知道继承构造函数是 C++11 的一个特性。但是类

D
不会继承
B::B(int)
构造函数,即使这行
D d = D(10);
可以编译。我的问题是,为什么它只能在 C++20 中编译,而不能在 C++17 中编译?是否有适用于此的 C++ 标准的引用?

我正在使用g++11.2.0。

c++ class constructor c++20
2个回答
7
投票

C++20 添加了使用括号初始化聚合的功能;参见P0960。以前,您可以使用

d
初始化
D d{10};
;现在你可以用括号而不是大括号做同样的事情。类
D
不会隐式继承
B
的构造函数。


4
投票

由于

struct D
是聚合类型,在 C++20 之前,您不能使用
()
进行初始化,例如
D(10)

感谢 P0960,现在在 C++20 中,您可以从带括号的值列表初始化聚合。请注意,目前,只有GCC-10和MSVC-19.28的更高版本实现了此功能,对于Clang来说,它会仍然抱怨

<source>:15:9: error: no matching conversion for functional-style cast from 'int' to 'D'
  D d = D(10);
        ^~~~
© www.soinside.com 2019 - 2024. All rights reserved.