передача строкового литерала в функцию, которая принимает std :: string & - PullRequest
13 голосов
/ 28 октября 2010

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

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

27 голосов
/ 28 октября 2010

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

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

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

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

std::string valstr("modvalue");
document.AddNodeValue(modvalue, valstr);
// valstr might have changed, check the documentation of AddNodeValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...