Неожиданное поведение ссылки на постоянный временный объект

0

Следующий код компилируется в 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() мертв, прежде чем он войдет в тело функции!

  • 0
    Я не понимаю, в чем проблема, что у вас здесь. Принимается const ссылка, поэтому передача временного значения в такую функцию совершенно нормально, так как функция все равно не может изменить параметр.
  • 0
    @PaulMcKenzie: В моем понимании постоянство и временность - это не одно и то же, и они не подразумевают друг друга. Мой комментарий к ответу ravi предполагает, что d_SS.str () не является константой, так как вы можете изменить ее.
Показать ещё 1 комментарий
Теги:
visual-studio-2013

1 ответ

1
Лучший ответ

d_SS.str() мертв, прежде чем он войдет в тело функции!

Не правда; он все еще жив до конца текущего полного выражения, которое в этом случае является точкой с запятой в конце aa.f( d_SS.str() ); ,

Существует только опасность, если aa.f принимает ссылку или указатель на свой аргумент и сохраняет это в какой-то внешней области данных. Это абсолютно безопасно для aa.f чтобы просто прочитать его аргумент.

  • 0
    Спасибо. Для справки я нашел этот другой связанный вопрос . Проще говоря: «разрешить использование ссылки на временный объект - это что-то очень опасное, не так ли?» Ответ: Нет, если это постоянная ссылка, потому что она продлит жизнь объекта до точки с запятой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню