Например, вИмеет ли std :: move результат в разрезе?
unique_ptr<Derived> = new deriv;
std::vector<unique_ptr<Base>>.push_back(std::move(deriv));
будет DERIV быть нарезаны к типу unique_ptr<Base>
?
Например, вИмеет ли std :: move результат в разрезе?
unique_ptr<Derived> = new deriv;
std::vector<unique_ptr<Base>>.push_back(std::move(deriv));
будет DERIV быть нарезаны к типу unique_ptr<Base>
?
Никакой нарезки не произойдет; unique_ptr<Base>
будет принадлежать указателю на объект Derived
.
A unique_ptr
в производный класс может быть неявно преобразован в unique_ptr
в базовый класс.
(ваш пример не компилируется в текущем редактирования, я просто буду считать, что ваше намерение было)
Нет, это не так. Slicing относится к копированию производных объектов в базовый объект, а не в производный указатель на указатель Base (здесь уникальная_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);
}
Любой нарезка, что может произойти, будет происходить от типа элемента контейнера. Объекты, содержащиеся косвенно, не затрагиваются.