Следующий код компилируется в Visual Studio 2013 без каких-либо предупреждений. Удаление комментария в последней строке не будет компилироваться. Это ошибка в Visual Studio 2013? Если нет, как я должен понимать это в стандарте?
Я думаю, что разрешение на обращение к временному объекту является чем-то очень опасным, не так ли?
struct A
{
string a;
void f( const string & toMove )
{
a = toMove;
}
void g( string & toMove )
{
a = toMove;
}
} aa;
stringstream d_SS;
d_SS << "A string";
aa.f( d_SS.str() );
//aa.g( d_SS.str() );
редактировать
В этом связанном вопросе они объясняют, что "не разрешено получать неконстантную ссылку на временный объект". Тогда мой вопрос будет заключаться в том, почему нам разрешено получать ссылки const на временные объекты так, как это aa.f( d_SS.str() )
. d_SS.str()
мертв, прежде чем он войдет в тело функции!
d_SS.str() мертв, прежде чем он войдет в тело функции!
Не правда; он все еще жив до конца текущего полного выражения, которое в этом случае является точкой с запятой в конце aa.f( d_SS.str() );
,
Существует только опасность, если aa.f
принимает ссылку или указатель на свой аргумент и сохраняет это в какой-то внешней области данных. Это абсолютно безопасно для aa.f
чтобы просто прочитать его аргумент.
const
ссылка, поэтому передача временного значения в такую функцию совершенно нормально, так как функция все равно не может изменить параметр.