移动构造函数签名

Move constructor signature

本文关键字:构造函数 移动      更新时间:2023-10-16

从这个引用中,它允许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对这个问题的解释,但似乎找不到它了。希望以上内容对您有所帮助。