类型为std :: basic_string <char> :: const_iterator的非const引用的无效init和来自std :: basic_string <char> :: const_iterator类型的rvalue的无效init

Olu*_*ide 2 c++ gcc

我在GCC上编译以下MWE时遇到上述错误

#include <string>

void frobnigate( const std::string& str )
{
    std::string::const_iterator& iter = str.begin();
}

int main()
{
    frobnigate( "all things!!!" );
}
Run Code Online (Sandbox Code Playgroud)

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

Whi*_*TiM 6

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

是的,你做错了什么.

std::string::begin()返回值类型(rvalue,因为它是临时的).但是你试图从rvalue初始化一个非const引用,这在C++中是非法的.

你绝对想要:

std::string::const_iterator iter = str.begin();
Run Code Online (Sandbox Code Playgroud)

更好的是:

auto iter = str.begin();
Run Code Online (Sandbox Code Playgroud)

迭代器的复制成本很低,应该按值使用,因此对迭代器的引用或const引用是不受欢迎的.