以下代码在 gcc 9.1 中编译 godbolt但不是 clang 8 godbolt :
class A {
protected:
~A() = default;
};
class B final : public A {
};
int main() {
auto b = B{};
}
Clang 的错误:
<source>:10:16: error: temporary of type 'A' has protected destructor
auto b = B{};
^
<source>:3:5: note: declared protected here
~A() = default;
^
哪个是正确的,为什么?
最佳答案
感谢评论中的澄清;
从 C++17 开始,B{}
是聚合的,即使它是从 A
派生的,因此将为聚合创建一个临时的 A
由无权访问 dtor
的用户初始化。所以 clang 拒绝编译是正确的。标准:
no virtual, private, or protected (since C++17) base classes
但是使用 ()
将按照标准规定工作。
基的dtor
可以是public或protected。
A common guideline is that a destructor for a base class must be either public and virtual or protected and nonvirtual
与 C++11 相比,表达式 B()
是一个 prvalue
,并且 auto b = B();
是一个移动构造,移动可能会被省略,在 C++17 中,没有移动。 prvalue
未被移动。这是值初始化 B()
并且完全等同于:
B();
关于c++ - 这段代码是否会产生物化的基纯右值,它应该编译吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56497790/