gpt4 book ai didi

c++ - 为什么 std::vector::reserve 调用复制构造函数?

转载 作者:可可西里 更新时间:2023-11-01 18:25:23 27 4
gpt4 key购买 nike

为什么以下代码不适用于 g++ 4.9.2 版?如果我尝试构建它,编译器会在告知 vector 保留更多内存的行中提示缺少复制构造函数。

#include <vector>

class Number
{
public:
explicit Number(const int& i) : _value(i) {}

Number(const Number& other) = delete;
Number& operator=(const Number& other) = delete;

private:
int _value;
};


int main(int argc, char** argv)
{
std::vector<Number> numbers;
numbers.reserve(8);

return 0;
}

为什么编译器甚至会在 vector 的存储大小增加时尝试调用已删除的复制构造函数?无论如何, vector 中没有对象。

最佳答案

简短的回答是因为语言标准是这么说的。但这并不有趣。

如果容器中有数据,Reserve可以调用复制构造函数。

它跟随在reserve的哪个分支(不复制,或复制)是在运行时确定的,而不是编译时。

您看到的是编译时错误,而不是运行时错误。您已声明不应编译任何可能导致您的对象复制的代码。

编译器不分析reserve所在的位置,向自己证明 vector 是空的,用它来确定代码reserve将运行的分支,然后说“没问题”。相反,它会编译包含拷贝的函数并生成错误。

理论上,允许预分配(空时)和仅放置构造(达到预定限制)的容器不需要具有任何类型的复制或移动构造的对象。在编写 std 容器库时,emplace 构造是不切实际的,因此此选项在 std 容器库中不存在:在 C++11 之前,唯一将对象放入 vector 的方法是复制它。

std::dynarray 接近,但它不会让缓冲区处于半闲置状态并逐渐填充。

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

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