我真的不明白为什么会这样。
我有一些声明如下的函数:
std::string unmaskString(std::string &oValue);
在代码中我这样做:
v = unmaskString(line.substr(eq+1));
我收到编译错误说:
error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >'
当我把它放在两个单独的陈述中时,它起作用:
v = line.substr(eq+1);
v = unmaskString(v);
第一行返回一个字符串对象,甚至不是引用,所以我真的不明白错误。
将功能更改为
std::string unmaskString(std::string oValue);
也会出错。
更新:
将maskString更改为unmaskString,因为这是一个错误,但问题仍然适用,因为masString具有相同的签名。
答案 0 :(得分:7)
结果:
line.substr(eq+1)
是std::string
类型的临时对象。临时值是 rvalues ,左值引用不能绑定到右值。
注意,如果你的maskString()
函数不需要修改它的参数(为什么它会返回std::string
否则?),它没有理由接受它的参数作为参考非 - const
可能的解决方案是(按照优先顺序):
让maskString()
按值输入 ,以便输入参数复制(如果它是左值并且已移动) 如果是右值:
std::string maskString(std::string oValue);
// ^^^^^^^^^^^
{
// Whatever is going on...
return oValue; // This will be MOVED into the object that stores
// the value returned by this function
}
让maskString()
通过对const
的左值引用来获取其输入(这样value
oValue
的初始化将始终生成副本,即使参数是临时的),然后将其复制到最终将返回并移动的临时变量中。这是有效的,因为对const
的左值引用可以绑定到右值(因此也可以绑定到临时值):
std::string maskString(std::string const& oValue);
// ^^^^^
{
std::string value = oValue;
// Whatever is going on...
return value; // This will be MOVED into the object that stores
// the value returned by this function
}
执行您的操作:将substr
返回的对象存储在命名对象中,并将该对象传递给unmaskString()
。