gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:04:36 26 4
gpt4 key购买 nike

我有以下非常简单的类:

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

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

void dump() const {}
};

该类是可 move 构造和可赋值的,但不是可复制构造和可赋值的。

我想使用 vector 的初始化列表来初始化 Foo 元素的 vector 。

std::vector<Foo> vf = { Foo() };

编译器会报错,因为代码必须使用已删除的复制构造函数。谁能解释一下,为什么在这种情况下不使用 move 构造,为什么需要对象的拷贝?

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

std::vector<Foo> vf = { std::move(Foo()) };

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

std::vector<Foo> vf;
vf.push_back(Foo());

感谢您的解释...:)

更新:

一个建议this帖子解释了我的问题。

此外,让我们考虑以下代码(连同上面的 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 b { Foo() };
return 0;
}

这会产生以下输出(使用 C++11 编译):

Foo::Foo()
Bar::Bar()
Foo::dump()
Foo::~Foo()

可以看出,初始化列表实际上并没有填充大括号之间声明的“对象的拷贝”。这在 C++14 中可能并非如此。

最佳答案

特别是因为您使用了 initializer list使用了复制构造函数。初始化器列表使用对象的拷贝 进行初始化,然后传递给 vector 。

如果你阅读链接引用,从 C++14 开始,它甚至明确地说

... each element is copy-initialized ... from the corresponding element of the original initializer list

强调我的

关于c++ - 为什么在 std::vector 的初始化列表中调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36420829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com