确保使用普通类型移动std向量

时间:2014-10-27 16:59:38

标签: c++ c++11 move-semantics

说我有一个整数的载体

std::vector<int16_t> samples;

是否有一种很好的方法可以禁止复制到此向量中,以便只允许移动?我知道std::move,但是如果尝试复制,我想要像编译错误(如unique_ptr),而不是仅仅依靠程序员“做正确的事”(tm)

2 个答案:

答案 0 :(得分:1)

如果它是类成员,那么只需将其设为私有,并且只允许以您希望的方式进行访问:

std::vector<int16_t> const & get_samples() {return samples;}
void set_samples(std::vector<int16_t> && s) {samples = std::move(s);}

否则,您无法执行特定的访问模式。

答案 1 :(得分:1)

制作一个不可复制的包装器:

#include <vector>

template<typename T>
class   uncopyable
{
public:
  uncopyable(const uncopyable&) = delete;

  uncopyable(uncopyable&&) = default;

  uncopyable(T&& data)
    :
    data_(std::move(data))
  {
  }

public:
  uncopyable&   operator=(const uncopyable&) = delete;

  uncopyable&   operator=(uncopyable&&) = default;

  uncopyable&   operator=(T&& data)
  {
    data_ = std::move(data);
    return *this;
  }

private:
  T       data_;
};

int     main()
{
  std::vector<int>      big(10000);

  uncopyable<std::vector<int>>  uncopyable_big(std::move(big));

  std::vector<int>      other_big(10000);

  uncopyable_big = std::move(other_big);
}

如果您想保证不制作副本,请使用此类型代替vector