Функции, принимающие параметры rvalue

Я видел довольно много кода в своей компании, где функции принимают аргументы rvalue.

Пример:

void Notifier::PostEvent(std::unique_ptr<IEvent>&& event)
{
    std::unique_lock<std::mutex> lock(m_Mutex);
    m_events.push_back(std::move(event));
    m_conditionVariable.notify_all();
}

Здесь нет шаблонов. Это можно было бы легко написать так:

void Notifier::PostEvent(std::unique_ptr<IEvent> event)
{
    std::unique_lock<std::mutex> lock(m_Mutex);
    m_events.push_back(std::move(event));
    m_conditionVariable.notify_all();
}

Поскольку параметр «событие» является значением приемника, в обоих случаях они фактически одинаковы. Я думаю, что единственным преимуществом первой версии является то, что она экономит один конструктор перемещения для unique_ptr. Это правильно? Это действительно того стоит?

Возможный дубликат Передача по значению против передачи по ссылке rvalue

Evg 22.06.2019 13:45

Возможный дубликат Как передать аргумент unique_ptr конструктору или функции?

Richard Critten 22.06.2019 14:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ok. Теперь я лучше понимаю после прочтения Как передать аргумент unique_ptr конструктору или функции?

Происходит то, что в моем первом примере, где я перехожу по ссылке rvalue, это более или менее похоже на передачу по неконстантная ссылка lvalue. Хотя вы можете ожидать, что параметр будет пустым после вызова функции, это не гарантируется. Все зависит от того, что функция на самом деле делает с ним. Нажимая/перемещая его в вектор, как я делаю здесь, unique_ptr будет пустым. Однако, если я ничего не перемещаю (скажем, просто вызываю метод класса IEvent), тогда unique_ptr не пуст.

Таким образом, ссылочный параметр rvalue unique_ptr фактически не определяет гарантия того, что происходит со значением после вызова, т. е. является ли оно приемником или нет. Он может быть пустым после звонка, а может и не быть. Только изучив код, можно определить, что произойдет.

Оглядываясь назад, я думаю, что второе определение функции, в котором она принимает unique_ptr по значению, лучше. Это гарантирует, что unique_ptr был перемещен и больше не должен использоваться после этого.

Другие вопросы по теме