C++ std::basic_string类型的非常量引用的init无效<;char>;::常量迭代器&;来自std::basic_string类型的右值<;char>;::常量迭代器

C++ std::basic_string类型的非常量引用的init无效<;char>;::常量迭代器&;来自std::basic_string类型的右值<;char>;::常量迭代器,c++,gcc,C++,Gcc,当我在GCC上编译下面的代码时,我得到了上面的错误 #包括 void frobnigate(const std::string和str) { std::string::const_迭代器&iter=str.begin(); } int main() { frobnigate(“万物!!!”); } 我是做错了什么,还是这是一个GCC问题?您应该这样做: std::string::const_iterator iter = str.begin(); 也就是说,删除引用,因为begin()返回的

当我在GCC上编译下面的代码时,我得到了上面的错误

#包括
void frobnigate(const std::string和str)
{
std::string::const_迭代器&iter=str.begin();
}
int main()
{
frobnigate(“万物!!!”);
}
我是做错了什么,还是这是一个GCC问题?

您应该这样做:

std::string::const_iterator iter = str.begin();
也就是说,删除引用,因为
begin()
返回的是一个值,而不是引用,并且您需要管理迭代器的生存期(它将是一个简单、小、便宜的值,例如指针)

我是做错了什么,还是这是一个GCC问题

是的,你做错了什么

返回(右值,因为它是临时值)。但是,您试图从一个在C++中非法的rValst初始化非const引用。 你肯定想要:

std::string::const_iterator iter = str.begin();
更好的是:

auto iter = str.begin();

迭代器的复制成本很低,应该按值使用,因此不赞成对迭代器的引用或常量引用

auto iter = str.begin();