Возврат 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 шт):
Я ожидал, что для обоих случаев возникнет ошибка.
Эффект от неопределенного поведения может быть любой, в том числе отсутствие ошибки.
Clang, например, с флажком -O3 выдает вместо 600 мусор.
Неопределенное поведение - оно такое неопределенное....
Понимаете, вы можете перебегать дорогу на красный свет светофора. Можете переходить ее с завязанными глазами и заткнутыми ушами. И у вас это будет отлично получаться... до поры до времени.
И совсем не факт, что вас соберут с асфальта и увезут в морг после первой же попытки перехода на красный. И это не основание обижаться на ПДД и говорить, что у вас неправильные дороги и светофоры, раз вы живой...
Но и то, что после нескольких переходов вы остались живы и здоровы - не является основанием говорить, что "на красный переходить можно, я проверял!"...
Переменная типа int поменьше, больше шансов, что ее не зацепит - в отличие от string, внутри которой есть еще указатель на другое место в памяти...
Я ожидал, что для обоих случаев возникнет ошибка.
Ошибкой здесь, в первую очередь, является ожидание получить от этих примеров какой-то определенной результат. В С++ существует множество требований, ответственность за соблюдение которых лежит на программисте, а не соблюдение которых делает невозможным судить о поведении программы по ее исходному коду. Доступ только к валидным объектам - одно из них. Соответственно В С++ в принципе нельзя написать тест, проверяющий или доказывающий валидность ссылки, так как разыменование невалидной ссылки сразу делает любые ожидания по поведению написанного кода бессмысленными.