来自类型为std::basic_string::const_iterator的非常量引用的无效初始化,并且<char>来自类型std::basic_string<char>::

Invalid init of non-const reference of type std::basic_string<char>::const_iterator& from rvalue of type std::basic_string<char>::const_iterator

本文关键字:gt char lt basic std 类型 string 并且 初始化 非常 iterator      更新时间:2023-10-16

当我在 GCC 上编译以下 MWE 时出现上述错误

#include <string>
void frobnigate( const std::string& str )
{
std::string::const_iterator& iter = str.begin();
}
int main()
{
frobnigate( "all things!!!" );
}

我做错了什么还是这是海湾合作委员会的问题?

我做错了什么还是这是 GCC 问题?

是的,你做错了什么。

std::string::begin()返回一个值类型(右值,因为它是临时的)。但是您正在尝试从右值初始化非常量引用,这在C++中是非法的。

您肯定想要:

std::string::const_iterator iter = str.begin();

更好的是:

auto iter = str.begin();
迭代

器复制起来很便宜,应该按值使用,因此对迭代器的引用或常量引用是不受欢迎的。

你应该这样做:

std::string::const_iterator iter = str.begin();

也就是说,删除引用,因为begin()返回一个值,而不是一个引用,并且您需要管理该迭代器的生存期(这将是一个简单、小、便宜的值,例如指针)。