我想创建一个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。那么为什么编译器会抱怨丢失的移动构造函数,如果它还没有使用它呢?我应该如何正确初始化一组不可复制的不可移动的对象?