Почему GCC производит здесь -Wreduntant-move?C++

Программы на C++. Форум разработчиков
Anonymous
Почему GCC производит здесь -Wreduntant-move?

Сообщение Anonymous »

У меня есть такая функция, которая создает -Wreduntant-move:

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

std::optional func(const bool f) {
std::string res;
if (f)
return {};
else
res += "asd";
return std::move(res);
}

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

std::optional
имеет конструктор, который без std::move должен привести к копии res

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

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

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