#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> vec = {1,2,3,4};
for(auto & it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << endl;
}
}
大家好,在 C 中,我通过引用使用迭代器,例如“auto
“错误:'__gnu_cxx::__normal_iterator类型的非常量引用的初始化无效
我知道“auto it = vec.begin()”工作正常,但是我们都知道通过引用传递将提高C语言的效率,那么为什么当我使用“auto
那么为什么当我使用“自动”时会出现这个错误呢?
请参阅开始
的返回类型。它不返回引用。它按值返回迭代器。因此,返回值是右值类别中的临时值。临时值(右值)不能绑定到非常量左值引用。这就是错误“无效初始化类型的非常量引用...从类型的右值...”方法。
此外,修改容器的开始
指针没有什么意义。开始
返回引用是愚蠢的。
解决方案:通过声明一个非引用值来创建一个迭代器的副本,就像你知道的那样。
但是众所周知,通过引用传递会提高C语言的效率
这是无稽之谈。任意放置的参考不太可能提高效率。此外,您不会尝试在此处传递引用。您正在尝试将引用绑定到函数返回的对象。
几乎(如果不是总是这样的话),迭代器的复制速度非常快(std::vector::迭代器
当然是这样),并且您可能使用引用引入的间接寻址可能效率会降低。
std::vector::begin
返回一个右值(一个临时对象)。不能使用auto获取对临时对象的引用
使用<代码>自动
使用右值引用不会提高代码的效率,编译器将通过值优化从std::向量::begin
返回的交互器对象的复制/移动。
auto 关键字从表达式 (std::vector::begin) 中获取类型作为临时对象,因为它是临时对象,因此编译器无法推断出对它的引用。自动
在您的情况下,最好的方法是使用没有参考的自动变量而不是自动
如果你被迫使用引用C 11引入了rvalue-reference,它可以绑定到临时对象更改为
vector<int> vec = {1,2,3,4};
for(auto && it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << endl;
}