代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

将字符串文本传递给接受std::string的函数&

  •  13
  • Tony The Lion  · 技术社区  · 14 年前

    我有以下功能

    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

    1 回复  |  直到 14 年前
        1
  •  27
  •   Steve Jessop    14 年前

    你的职能需要 const std::string& 让你这样使用它。

    C++有一个规则,即在你的情况下,一个临时值 std::string 可以用常量引用绑定,但不能用非常量引用绑定。

    据我所知,这个限制不是由于任何基本的实现问题,因为临时值 以其他方式修改。但是,假定接受非常量引用的函数这样做是因为它的主要目的是修改该参数。用临时的方法来做这件事通常没有多大的意义,所以可能禁止它会发现错误,而不是阻止人们做有价值的事情。无论如何,并不是所有的rvalue都是临时的:有些是不能修改的文本。

    如果无法更改函数AddNodeValue,则可以解决它:

    std::string valstr("modvalue");
    document.AddNodeValue(modvalue, valstr);
    // valstr might have changed, check the documentation of AddNodeValue