c ++ 11:为什么是“auto&”没有推断出正确的类型?

时间:2015-01-19 04:21:48

标签: c++ c++11 type-inference

我有以下代码:

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));
  }    
}

在for循环行中出现以下错误:

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。

1 个答案:

答案 0 :(得分:10)

摆脱&符号。你想要一个迭代器的副本,而不是它的引用。

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

编译器不会为非const引用分配临时值。