Я читаю this ответ о перемещении семантики и придумать проблему. Он описывает так называемый перемещение и своп идиома:Переместить семантический и объект тип параметра
unique_ptr& operator=(unique_ptr source) // note the missing reference
{
std::swap(ptr, source.ptr);
return *this;
}
Поскольку оператор присваивания двигаться должны работать на RValue ссылки, я думал, что это приемлемо передать ссылку RValue в качестве аргумента. Вот пример:
#include <iostream>
struct A {
A(){ }
virtual ~A(){ }
A(A&&){ }
};
void foo(A a){
std::cout << "foo(A)" << std::endl;
}
int main()
{
foo(*new A);
}
Но компилятор предупреждает меня, что он пытался скопировать объект ссылки и не потому, что копия-конструктор удаляется. Я не знаю, почему это правильно в примере с unique_ptr
. Объект должен быть скопированы когда мы вызываем функцию, так что нет никакого смысла двигаться семантических.
Не могли бы вы немного объяснить это?
Я не уверен, насколько сильным является ваше понимание C++, '* new T' обычно является подарком не понимающей семантики значения. То, что вы хотели бы в реальной жизни, это 'foo (A {});' но, конечно же, вы знаете это, и это просто академический. –
'* new A' - это значение lvalue. Он обозначает место памяти, в котором хранится объект. Чтобы переместиться, вам нужно написать 'std :: move (* new A)' (который будет утечка памяти) –
«' * new A' », как вы собираетесь« удалить », что' A'? – emlai