Возврат rvalue ref локального объекта функции

Почему в данном примере, с функцией для типа int, все корректно работает и std::cout<<ss; = 600

int&& funcReturn1()
{
    int val = 600;
    return move(val);
}
int ss = funcReturn1();

А с функцией для string уже возникает ошибка

string&& funcReturn2()
{
    string val = "HELLO";
    return move(val); // ошибка??
}
string s = funcReturn2();

Я ожидал, что для обоих случаев возникнет ошибка.


Ответы (3 шт):

Автор решения: HolyBlackCat

Я ожидал, что для обоих случаев возникнет ошибка.

Эффект от неопределенного поведения может быть любой, в том числе отсутствие ошибки.

Clang, например, с флажком -O3 выдает вместо 600 мусор.

→ Ссылка
Автор решения: Harry

Неопределенное поведение - оно такое неопределенное....

Понимаете, вы можете перебегать дорогу на красный свет светофора. Можете переходить ее с завязанными глазами и заткнутыми ушами. И у вас это будет отлично получаться... до поры до времени.

И совсем не факт, что вас соберут с асфальта и увезут в морг после первой же попытки перехода на красный. И это не основание обижаться на ПДД и говорить, что у вас неправильные дороги и светофоры, раз вы живой...

Но и то, что после нескольких переходов вы остались живы и здоровы - не является основанием говорить, что "на красный переходить можно, я проверял!"...

Переменная типа int поменьше, больше шансов, что ее не зацепит - в отличие от string, внутри которой есть еще указатель на другое место в памяти...

→ Ссылка
Автор решения: user7860670

Я ожидал, что для обоих случаев возникнет ошибка.

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

→ Ссылка