提问人:cpp 提问时间:11/8/2023 最后编辑:cpp 更新时间:11/8/2023 访问量:87
如果对象具有用户定义/声明的析构函数,为什么编译器将static_cast添加到 const rvalue ref
Why did compiler add static_cast to const rvalue ref if an object has a user defined/declared destructor
问:
struct Apple {
~Apple() {};
};
int main()
{
Apple a1;
Apple a2 = std::move(a1);
}
和例子
struct Apple {
~Apple() = default;
};
int main()
{
Apple a1;
Apple a2 = std::move(a1);
}
由编译器完成以下转换
struct Apple
{
inline ~Apple() /* noexcept */ = default;
// inline constexpr Apple() noexcept = default;
// inline constexpr Apple(const Apple &) noexcept = default;
};
int main()
{
Apple a1;
Apple a2 = Apple(static_cast<const Apple &&>(std::move(a1)));
return 0;
}
编译器添加于static_cast<const Apple &&>
Apple a2 = Apple(static_cast<const Apple &&>(std::move(a1)));
如果有用户定义/声明的析构函数。 根据示例,情况并非如此
struct Apple {
};
int main()
{
Apple a1;
Apple a2 = std::move(a1);
}
其中编译器转换后的代码片段是
struct Apple
{
// inline constexpr Apple() noexcept = default;
// inline constexpr Apple(Apple &&) noexcept = default;
};
int main()
{
Apple a1;
Apple a2 = Apple(std::move(a1));
return 0;
}
如果用户未定义/声明析构函数。
为什么会这样?
PS 人们倾向于认为这是因为使用用户声明/定义的析构函数,编译器只会隐式生成复制构造函数,而不会移动构造函数。这是正确的。 但即使只有复制构造函数而没有移动构造函数,const Apple& 也能够绑定到 rvalue ref 并且static_cast<const Apple&> 对于代码编译不是必需的,对吗?
答: 暂无答案
评论
Apple(Apple&&)