来自类型为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
当我在 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()
返回一个值,而不是一个引用,并且您需要管理该迭代器的生存期(这将是一个简单、小、便宜的值,例如指针)。