[英]How do I have a const member move-only object without making my object copyable?
#include<algorithm>
#include<vector>
#include<memory>
class Foo {
public:
Foo();
#if 1
// Destructor for rule of 5.
~Foo(){}
// Move constructor yes.
Foo(Foo&&) noexcept = default;
// Move assignment probably won't actually be created because const member variable.
// Do I need it though? Why would vector need to move-assign?
Foo& operator=(Foo&&) noexcept = default;
// Copy no.
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
#endif
protected:
// It works if non-const. Broken if const.
const std::unique_ptr<int> ptr;
};
int main()
{
std::vector<Foo> bar;
bar.reserve(1);
}
我收到错误(使用 GCC):
static assertion failed: result type must be constructible from value type of input range
但为什么?
对我来说,默认构造函数和移动构造函数看起来都应该没问题。 这是万一例如我const_cast
const 并擦除中间元素, vector
可能会尝试移动分配以“碎片整理”向量? (而如果它试图破坏+移动构造,那就行得通了)
在上面的片段中, unique_ptr
代表我自己的只移动类型,所以这个问题与指针无关。
如何在不使我的 object 可复制的情况下让 const 成员仅移动 object?
拥有一个只能移动的成员 object 会使您的 class 隐式不可复制,因此没有什么特别需要做的来实现这一点。
我得到错误
但为什么?
因为你的 class 不满足 MoveInsertable 的要求。 这是因为它不是移动可构造的。
对我来说,默认构造函数和移动构造函数看起来都应该没问题。
由于不可移动的成员,移动构造函数不好。 该成员是不可移动的,因为它既是不可复制的又是常量。
总之:您可以像这样拥有一个 class,但它不能与std::vector::reserve
一起使用,因为它既不可复制也不可移动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.