C ++: Скопировать elision при передаче значения std :: unique_ptr (только для перемещения) в качестве параметра - PullRequest
4 голосов
/ 15 мая 2019

Я могу передать значение std::unique_ptr r в качестве параметра функции, как показано ниже, из-за исключения копирования. Гарантируется, что копия будет исключена стандартом C ++ 11, или это может не скомпилироваться в некоторых реализациях?

void take_unique_ptr_by_value(std::unique_ptr<int> sp) {
  cout << "Value is " << *sp.get() << std::endl;
}
// I am able to call the function above like this:
take_unique_ptr_by_value(std::make_unique<int>(3));

Ответы [ 2 ]

5 голосов
/ 15 мая 2019

из-за elision копии

Нет, это из-за конструктора перемещения .

Кроме того, elision copy - это просто оптимизация ивсе еще требует, чтобы код был действительным.Поэтому

struct S
{
    S() = default;
    S(const S&) = delete;
    S(S&&) = delete;
};

S s = S(); // Won't compile prior C++17

C ++ 17 вводит «гарантированное исключение копирования» (в некоторых контекстах), которое снимает это ограничение.

Подробнее о документация copy_elision

0 голосов
/ 16 мая 2019

Чтобы собрать воедино некоторые ответы более явно, как упомянул @ Jarod42, даже если удаление копии должно было произойти, конструктор копирования / перемещения, который должен быть исключен, все еще должен существовать. Во-вторых, я забыл, что параметр, который я передаю, является значением r, поэтому он вызовет конструктор перемещения, если его нужно «скопировать». Так что скопируйте elision или нет, пример кода верен, потому что std::unique_ptr имеет конструктор перемещения, и я передаю rvalue. Этот другой ответ довольно полный.

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