Почему 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
Ответить

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

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

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

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

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