C ++ brace-initialize std :: array需要move-constructor?

时间:2017-03-21 11:45:16

标签: c++ arrays c++11 constructor

我想创建一个std::array个不可移动且不可复制的对象。此外,默认构造函数被删除,只有一个带有字符串参数的构造函数。

#include <iostream>
#include <array>

class Foo {
 public:
  Foo() = delete;                // delete default constructor
  Foo(const Foo &obj) = delete;  // delete copy constructor
  Foo(Foo &&obj) = delete;       // delete move constructor

  Foo(std::string label) {
    label_ = label;
    std::cout << "Constructor " << std::endl;
  }

  ~Foo() {
    std::cout << "Destructor" << std::endl;
  }

 private:
  std::string label_;
};


int main() {
  std::array<Foo, 3> arr = {Foo("a"), Foo("b"), Foo("c")};
}

编译器不接受这个,我收到如下错误:

use of deleted function ‘Foo::Foo(Foo&&)’

如果我明确地实现了这样的移动构造函数:

Foo(Foo &&obj) {
  label_ = obj.label_;
  std::cout << "MOVE constructor" << std::endl;
}

所有内容都编译并运行,但是从输出中我看到不使用move-constructor。那么为什么编译器会抱怨丢失的移动构造函数,如果它还没有使用它呢?我应该如何正确初始化一组不可复制的不可移动的对象?

0 个答案:

没有答案