Код: Выделить всё
std::optional func(const bool f) {
std::string res;
if (f)
return {};
else
res += "asd";
return std::move(res);
}
Код: Выделить всё
std::optionalКод: Выделить всё
template< class U = std::remove_cv_t >
constexpr optional( U&& value );
- MSVC/Clang здесь не выдает никаких предупреждений.
- Добавление {() исправляет предупреждение
Код: Выделить всё
return { std::move(res) }; - Возврат любого из res, std::move(res), { std::move(res) создает ту же сборку с любым O*
- Почему выдается предупреждение
- Почему возникает нет копии в ctor с res
- Подразумевает ли здесь RVO(не должно быть, потому что decltype(res) отличается по типу возвращаемого значения функции, но по сборке - да)? Если нет, то как можно переписать этот код, чтобы включить RVO?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -move-here