我在GCC上编译以下MWE时出现上述错误
#include <string>
void frobnigate( const std::string& str )
{
std::string::const_iterator& iter = str.begin();
}
int main()
{
frobnigate( "all things!!!" );
}
我做错了什么还是GCC问题?
答案 0 :(得分:6)
我做错了什么还是GCC问题?
是的,你做错了什么。
std::string::begin()
返回value type( rvalue ,因为它是临时的)。但是你试图从 rvalue 初始化一个非const引用,这在C ++中是非法的。
你绝对想要:
std::string::const_iterator iter = str.begin();
更好的是:
auto iter = str.begin();
迭代器的复制成本很低,应该按值使用,因此对迭代器的引用或const引用不受欢迎。
答案 1 :(得分:2)
你应该这样做:
std::string::const_iterator iter = str.begin();
也就是说,删除引用,因为begin()
返回一个值而不是引用,并且你需要管理该迭代器的生命周期(这将是一个简单,小巧,便宜的值,如指针)