Подтвердить что ты не робот

Передавая строковый литерал функции, которая принимает std::string &

У меня есть следующая функция

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

4b9b3361

Ответ 1

Ваша функция должна принимать const std::string&, чтобы использовать ее так.

С++ имеет правило, что rvalue (в вашем случае временный std::string, который создается из строкового литерала) может быть связан с ссылкой на const, но не с неконстантной ссылкой.

Насколько я знаю, это ограничение не связано с какой-либо фундаментальной проблемой реализации, поскольку временные значения могут быть изменены другими способами. Предполагается, что функция, которая принимает неконстантную ссылку, делает это, потому что ее основная цель - изменить этот аргумент. Обычно это не имеет большого смысла делать с временным, поэтому, возможно, его запрет улавливает ошибки намного больше, чем препятствует тому, чтобы люди делали что-то стоящее. Во всяком случае, не все rvalues ​​являются временными: некоторые являются литералами, которые действительно не могут быть изменены.

Если вы не можете изменить функцию AddNodeValue, вы можете обойти ее:

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