繁体   English   中英

如何在不使我的 object 可复制的情况下让 const 成员仅移动 object?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM