尝试find_if向量中的unique_ptr时的编译错误

Iva*_*son 3 c++ gcc 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;
}
Run Code Online (Sandbox Code Playgroud)

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

prog.cpp:在函数'int main()'中:

prog.cpp:19:25:错误:从'__gnu_cxx :: __ normal_iterator*,std :: vector类型的右值开始,类型'__gnu_cxx :: __ normal_iterator*,std :: vector >>>&'的非const引用无效初始化>>'auto&it = std :: find_if(vec.begin(),vec.end(),[&](std :: unique_ptr&p)

  1. 哪个编译器被窃听?
  2. 如何从一个擦除指针std::vectorstd::unique_ptr正确?

krz*_*zaq 5

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

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

要么使它成为一个对象:

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

演示

或const引用:

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

演示

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