我有以下功能
void AddNodeValue(XMLNode& node, std::string& value);
我想这样用:
document.AddNodeValue(modvalue,"modvalue");
并且编译器抱怨:
error C2664: 'void XML::XMLDocument::AddNodeValue(XML::XMLNode &,std::string &)' : cannot convert parameter 2 from 'const char [9]' to 'std::string &'
A reference that is not to 'const' cannot be bound to a non-lvalue
我不明白为什么那是错的?
编译器:VS2003
答案 0 :(得分:27)
您的功能需要const std::string&
让您使用它。
C ++有一个规则,即rvalue(在您的情况下,是从字符串文字创建的临时std::string
)可以与const引用绑定,但不能与非const引用绑定。
据我所知,此限制不是由于任何基本的实现问题,因为临时值可以以其他方式修改。但是假设一个采用非const引用的函数这样做,因为它的主要目的是修改该参数。暂时做这件事通常没有多大意义,所以可能禁止它会远远超过阻止人们做一些有价值的事情。无论如何,并非所有的rvalues都是临时的:有些是真正无法修改的文字。
如果您无法更改AddNodeValue函数,那么您可以解决它:
std::string valstr("modvalue");
document.AddNodeValue(modvalue, valstr);
// valstr might have changed, check the documentation of AddNodeValue