【问题标题】:Why this code does allow to push_back unique_ptr do vector?为什么这段代码允许 push_back unique_ptr 做向量?
【发布时间】:2021-06-30 08:43:38
【问题描述】:

所以我认为向矢量添加唯一性是行不通的。 为什么它适用于以下代码? 是不是因为没有将复制ctor设置为“已删除”??

#include <iostream>
#include <vector>
#include <memory>

class Test
{
    public:
        int i = 5;
};


int main()
{
    std::vector<std::unique_ptr<Test>> tests;
    tests.push_back(std::make_unique<Test>());
    
    for (auto &test : tests)
    {
        std::cout << test->i << std::endl;
    }

    for (auto &test : tests)
    {
        std::cout << test->i << std::endl;
    }
}

【问题讨论】:

  • 为什么你认为你不能制作一个 unique_ptr 的向量?你可以,只要你从不复制这样的指针(你只能移动它们)。
  • 我也想知道 'for' 循环是如何引用向量元素的。 — for 循环变量是一个引用。引用不会自行复制/移动任何内容。

标签: c++ unique-ptr push-back


【解决方案1】:

这里没有副本,只有移动。

在这种情况下,make_unique 将生成一个未命名的唯一指针实例,并且此 push_back 将其视为 r 值引用,它可以随意使用它。

它产生的结果与这段代码几乎相同:

std::vector<std::unique_ptr<Test>> tests;
auto ptr = std::make_unique<Test>();
tests.push_back(std::move(ptr));

如果您想搜索有关此事的更多信息,这称为移动语义。 (这仅适用于 c++11 及更高版本)

【讨论】:

  • 欢迎,我尽量保持简洁,这很快就会变得相当复杂,网上的人比我解释得更好:)
【解决方案2】:

根据https://en.cppreference.com/w/cpp/container/vector/push_backstd::vector::push_back有两个重载

在您的情况下,您将使用带有 rvalue-ref 的那个,因此不需要复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2021-06-23
    • 2015-01-03
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多