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)
或const引用:
auto const& it = std::find_if(vec.begin(), vec.end(), [&](std::unique_ptr<Foo>& p)
除此之外,从向量中删除元素的代码是正确的
标签:c,gcc,unique-ptr 来源: https://codeday.me/bug/20190828/1755330.html