c ++ 11: почему «авто» и » не выведен на правильный тип?

У меня есть следующий код:

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.

0

Решение

Избавьтесь от амперсанда. Вам нужна копия итератора, а не ссылка на него.

for (auto ri = vec.rbegin(); ri != vec.rend(); ++ri) {

Компилятор не назначит временное значение неконстантной ссылке.

10

Другие решения


По вопросам рекламы [email protected]