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)
std::vector的std::unique_ptr正确?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)
除此之外,从向量中删除元素的代码是正确的
| 归档时间: |
|
| 查看次数: |
1360 次 |
| 最近记录: |