Функции, принимающие параметры rvalue - PullRequest
3 голосов
/ 22 июня 2019

Я видел довольно много кода в моей компании, где функции принимают аргументы 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();
}

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

1 Ответ

3 голосов
/ 22 июня 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...