移动构造函数签名
Move constructor signature
从这个引用中,它允许const
右值作为移动构造函数
Type::Type( const Type&& other );
一个可移动的物体怎么可能是const
?即使这在技术上是允许的,是否有这样的声明是有用的?
一个可移动的物体怎么可能是
const
?
它不能,但语言不是这么说的。语言说带有该签名的构造函数是"移动构造函数",但这并不意味着参数被移动,它只是意味着构造函数满足"移动构造函数"的要求。移动构造函数不需要移动任何东西,如果参数是const
,则不能。
是否有这样的声明是有用的?
是的,但不经常。当传递const临时函数作为实参时,如果您希望防止重载解析选择另一个构造函数,则此方法非常有用。
struct Type
{
template<typename T>
Type(T&&); // accepts anything
Type(const Type&) = default;
Type(Type&&) = default;
};
typedef const Type CType;
CType func();
Type t( func() ); // calls Type(T&&)
在这段代码中,从func()
返回的临时变量将不完全匹配复制或移动构造函数的参数,因此将调用接受任何类型的模板构造函数。为了防止这种情况,你可以提供一个接受const右值的重载,或者委托给复制构造函数:
Type(const Type&& t) : Type(t) { }
或者,如果您想阻止代码编译,则将其定义为已删除:
Type(const Type&& t) = delete;
请参阅https://stackoverflow.com/a/4940642/981959查看使用const右值引用的标准示例。
关于此功能意图的一些背景。
右值引用-来自Bjarne Stroustrup的博客
为c++语言增加Move语义支持的建议
一个有趣的问题。我在某个地方读到Stroustrup对这个问题的解释,但似乎找不到它了。希望以上内容对您有所帮助。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数采用std::string_view与std::string并移动
- C++:为什么不调用移动构造函数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 没有移动的构造函数移动课程
- 引用绑定和复制构造函数/移动构造函数
- 构造函数移动
- C++ 向量实现 - 移动构造函数 - 移动与前进
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 将类(没有默认构造函数)移动到另一个类的move构造函数中