c++ - 此代码是否会产生物化的基本纯右值,是否应该编译?
问题描述
以下代码在 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++17B{}
是聚合的,即使它是从 派生的A
,因此A
无权访问dtor
. 所以clang拒绝编译是正确的。标准:
然而,使用()
将按照标准所说的那样工作。
基础的dtor
可以是公共的或受保护的。
一个共同的准则是基类的析构函数必须是公共的和虚拟的或受保护的和非虚拟的
与 C++11 相比,表达式B()
是 a prvalue
,并且auto b = B();
是一个移动构造,移动可能会被忽略,在 C++17 中,没有移动。prvalue
不搬离。这是值初始化B()
,完全等同于:
B();
推荐阅读
- c++ - 如何声明 100 个相同类型的不同命名变量?
- python - 从字典创建列表
- laravel - Livewire:如何在传递参数时进行自定义分页
- ios - 用 UITextView 中的空格替换所有换行符
- flutter - Flutter 与 AWS 的集成(有和没有 Amplify)
- python - Django“无模式”/循环导入错误
- python - 如何使用 auto_timeseries model.predict 获得大于测试数据集日期范围的数据范围的预测?
- c++ - 一起使用 cppcoro 和 ASIO 的 co_spawn
- python - QSizePolicy.Minimum 和 QSizePolicy.Preferred 有什么区别?
- neo4j - 我在使用 GRANDstack 的 Netlify 生产中不断收到错误“未知指令”