其他分享
首页 > 其他分享> > c – 尝试在向量中find_if一个unique_ptr时出现编译错误

c – 尝试在向量中find_if一个unique_ptr时出现编译错误

作者:互联网

这段代码:

#include <memory>
#include <vector>
#include <algorithm>

struct Foo
{
    int bar;

    Foo(const int val) :
        bar(val)
    {
    }
};

int main() {
    std::vector<std::unique_ptr<Foo>> vec;
    vec.emplace_back(std::make_unique<Foo>(42));
    Foo* ptr = vec.back().get();
    auto& it = std::find_if(vec.begin(), vec.end(), [&](std::unique_ptr<Foo>& p)
    {
        return p.get() == ptr;
    });
    if (it != vec.end())
    {
        vec.erase(it);
    }

    return 0;
}

在MSVC中工作正常,但在GCC 5.1中出错:

prog.cpp: In function ‘int main()’:

prog.cpp:19:25: error: invalid initialization of non-const reference of type ‘__gnu_cxx::__normal_iterator*, std::vector > >&’ from an rvalue of type ‘__gnu_cxx::__normal_iterator*, std::vector > >’
auto& it = std::find_if(vec.begin(), vec.end(), [&](std::unique_ptr& p)

>哪个编译器被窃听?
>如何正确擦除std :: unique_ptr的std :: vector中的指针?

解决方法:

gcc在这里是正确的.你不能用rvalue初始化一个左值引用,而你正在为它引用迭代器(std::find_if返回一个rvalue)

auto& it = std::find_if(vec.begin(), vec.end(), [&](std::unique_ptr<Foo>& p)
    ^

要么使它成为一个对象:

auto it = std::find_if(vec.begin(), vec.end(), [&](std::unique_ptr<Foo>& p)

demo

或const引用:

auto const& it = std::find_if(vec.begin(), vec.end(), [&](std::unique_ptr<Foo>& p)

demo

除此之外,从向量中删除元素的代码是正确的

标签:c,gcc,unique-ptr
来源: https://codeday.me/bug/20190828/1755330.html