小编Pet*_*ter的帖子

为什么在std :: vector的初始化列表中调用复制构造函数?

我有以下非常简单的课程:

class Foo 
{
public:
  Foo() {}
  Foo(const Foo&) = delete;
  Foo(Foo&&) {}

  void operator=(const Foo&) = delete;
  void operator=(Foo&&) {}

  void dump() const {}
};
Run Code Online (Sandbox Code Playgroud)

该类是可构造和可分配的,但不是可复制的可分配的.

我想使用vector的初始化列表初始化Foo元素的向量.

std::vector<Foo> vf = { Foo() };
Run Code Online (Sandbox Code Playgroud)

编译器抱怨,因为代码必须使用已删除的复制构造函数.任何人都可以解释一下,为什么在这种情况下不使用移动构造,以及为什么需要复制对象?

以下还需要复制构造函数,但不起作用:

std::vector<Foo> vf = { std::move(Foo()) };
Run Code Online (Sandbox Code Playgroud)

另一方面,这工作正常(调用移动构造函数):

std::vector<Foo> vf;
vf.push_back(Foo());
Run Code Online (Sandbox Code Playgroud)

感谢您的解释... :)

更新:

建议这篇文章解释我的问题.

此外,让我们考虑以下代码(以及class Foo上面的代码):

class Bar {
public:
    Bar(std::initializer_list<Foo> _l) {
        std::cout << "Bar::Bar()" << std::endl;
        for (auto& e : _l)
            e.dump();
    }
};

int main() {
    Bar …
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list move-semantics

10
推荐指数
1
解决办法
2214
查看次数

标签 统计

c++ ×1

initializer-list ×1

move-semantics ×1