ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-28 20:06:40  阅读:247  来源: 互联网

标签: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;
}

在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有