У меня есть следующий код:
struct MyType{};
using vec_type = std::vector<std::unique_ptr<MyType>>;
void foo(vec_type vec, vec_type& vec2, vec_type::iterator itr){
for (auto &ri = vec.rbegin(); ri != vec.rend(); ++ri) {
vec2.insert(itr, std::move(*ri));
}
}
Он получает следующую ошибку в строке цикла:
non-const lvalue reference to type 'reverse_iterator<[...]>' cannot bind to a temporary of type 'reverse_iterator<[...]>'
Затем мне нужно перейти к следующему для его компиляции:
vector<unique_ptr<Titem> >::reverse_iterator ri = replaces.rbegin();
for (; ri != vec.rend(); ++ri) {
vec2.insert(itr, std::move(*ri));
}
Это не имеет смысла для меня — я не вижу никакой семантической разницы между двумя кодами. Разве компилятор не должен делать вывод, что «auto» vector<unique_ptr<Titem> >::reverse_iterator
?
Я использую Clang ++ 3,5.
Избавьтесь от амперсанда. Вам нужна копия итератора, а не ссылка на него.
for (auto ri = vec.rbegin(); ri != vec.rend(); ++ri) {
Компилятор не назначит временное значение неконстантной ссылке.