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