Почему NRVO не работает, если есть предыдущий оператор возврата?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему NRVO не работает, если есть предыдущий оператор возврата?

Сообщение Anonymous »

Скажем, у меня есть этот код:

Код: Выделить всё

std::string bar(...)
{
std::string out;
if (...) return out; // default constructed (empty)
out = stuff(...);
return out;
}
В этом примере происходит NRVO.
Почему в этом примере этого не происходит?

Код: Выделить всё

std::string bar(...)
{
if (...) {
std::string const out;
return {};
} else {
std::string const out = stuff(...);
return out;
}
}
Я не думаю, что есть какая-то технологическая причина, по которой это не могло бы произойти во втором случае; два обратных пути полностью не пересекаются. В стандарте указано, что это не может работать, или компиляторы просто недостаточно умны? (Или я что-то упускаю?)
(Насколько это важно, меня интересует только C++17 и более поздние версии. Обратите внимание: я мог бы понять, если бы проблема была в const во втором примере, но NRVO, похоже, тоже не работает без нее.)

Подробнее здесь: https://stackoverflow.com/questions/798 ... -statement
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»