Рассмотрим два класса, таких как эти:
#include <cstdio>
using std::puts;
class Base {
public:
Base() { puts("Create base"); }
Base(const Base &) { puts("Copy base"); }
Base(Base &&) { puts("Move base"); }
virtual ~Base() { puts("Delete base"); }
Base & operator=(const Base &) = delete;
};
class Derived : public Base {
public:
Derived() { puts("Create derived"); }
Derived(const Derived &) { puts("Copy derived"); }
Derived(const Base &) { puts("Copy derived from base"); }
Derived(Derived &&) { puts("Move derived"); }
Derived(Base &&) { puts("Move derived from base"); }
virtual ~Derived() { puts("Delete derived"); }
Derived & operator=(const Derived &) = delete;
};
и функция:
Base fn() {
Derived d;
// Fill in d here
return d;
}
Копирование базового класса является очень дорогой операцией, однако, поскольку производный класс не сильно отличается, он может быть преобразован в базовый объект с использованием семантики перемещения. Однако я не могу заставить компилятор использовать это неявно вместо конструкции копирования. Я попытался добавить следующее безуспешно:
Base::Base(Derived &&);
Derived::operator Base &&() &&;
Derived::operator Base() &&;
Есть ли способ избежать конструктора копирования, изменив только два класса, а не функцию fn
?
РЕДАКТИРОВАТЬ: Я знаю, как это сделать, если я мог бы изменить функцию fn
, но я не могу.