Ответ 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