Приводит ли std :: move к нарезке? - PullRequest
4 голосов
/ 22 июля 2010

Например, в

unique_ptr<Derived> = new deriv;
std::vector<unique_ptr<Base>>.push_back(std::move(deriv));

будет выведено разделение на тип unique_ptr<Base>?

Ответы [ 3 ]

6 голосов
/ 22 июля 2010

Нарезки не будет;unique_ptr<Base> будет владеть указателем на объект Derived.

A unique_ptr в производный класс может быть неявно преобразован в unique_ptr в базовый класс.

2 голосов
/ 22 июля 2010

(ваш пример не компилируется в текущем редакторе, я просто собираюсь предположить, каково было ваше намерение)

Нет, это не так.Под нарезкой понимается копирование производных объектов в базовый объект, а не на производный указатель в базовый указатель (здесь unique_ptr - красная сельдь).

Это приводит к разрезанию:

class a { };

class b : public a { };

void foo(a myvar) { };

int main()
{
    b myb;
    foo(myb);
}

Это не:

class a { };

class b : public a { };

void foo(a* myvar) { };

int main()
{
    b myb;
    foo(&myb);
}
1 голос
/ 22 июля 2010

Любая нарезка, которая может произойти, будет происходить с типом элемента контейнера. Объекты, содержащиеся косвенно, не затрагиваются.

...