Вот код:
std::vector<int> foo(bool cond) {
std::vector<int> result;
if (cond) {
return result; // (1)
}
result.push_back(42);
return result; // (2)
}
Одна и та же переменная result
возвращается из двух мест. Это все еще считается условием для NRVO?
P.S. Я понимаю, что этот код можно отрефакторить, чтобы вернуть это значение из одной точки, поэтому мой вопрос носит теоретический характер.
Обновление: Хорошо, NRVO не является обязательным даже в C++17. Есть ли какая-либо причина, по которой множественные возвраты не позволяют компилятору использовать NRVO, но оптимизация будет использоваться для одного возврата?
Вы можете протестировать его на предпочитаемых вами компиляторах, заменив вектор своим собственным классом с входом в конструкторы копирования/перемещения.
@NathanOliver, мне интересно, считается ли это по-прежнему NRVO (таким образом, обязательным с C++17) или дополнительной оптимизацией.
Предотвращает ли ранний возврат той же переменной NRVO?
Нет, NRVO по-прежнему возможен, и большинство реализаций действительно будут использовать его в этой ситуации.
Я понимаю, что это "еще возможно". Меня интересует C++17: если я правильно понимаю, так как эта версия NRVO является обязательной. Таким образом, это либо NRVO, либо «возможное расширение, не связанное с NRVO».
@DmitryKuzminov NRVO не является обязательным в C++17, даже если есть только один оператор возврата.
@DmitryKuzminov Ни в одной версии C++ нет обязательного NRVO.
@DmitryKuzminov Interjay отметил, что это не было бы обязательным, даже если бы был только один return
.
@DmitryKuzminov C++17 RVO является обязательным, NRVO не является обязательным, см. Копировать elision
@DmitryKuzminov Обязательное исключение копирования в C++17 предназначено только для prvalues (обычно временных объектов).
AFAIK, нет языкового правила, которое могло бы предотвратить это. «Это произойдет?», зависит от компилятора, оптимизаций и целевой платформы.