Этот код:Ошибка компиляции при попытке 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::vector
изstd::unique_ptr
правильно?
«прослушивание» подразумевает непреднамеренное поведение. Это не. Разработчики MSVC хорошо знают об этом и не намерены его менять. –
Однако, если вы хотите обеспечить соблюдение строгого соответствия стандартов (в лучшем случае из имеющихся возможностей компилятора), используйте флаг ['/ Za'] (https://msdn.microsoft.com/en-us/library/0k0w269d. ASPX). –