Здравствуйте, _hum_, Вы писали:
__>ну, хотелось бы полностью запретить неявные вызовы всех конструкторов, включая конструкторы перемещения.
Конструктор перемещения тоже можно сделать закрытым и это не помешает методу clone работать так, как задумано. Это благодаря наличию
Mandatory copy/move elision.
http://coliru.stacked-crooked.com/a/65cde38126b17c3
| | Код примера |
| | #include <iostream>
#include <memory>
class CA
{
std::unique_ptr<int> m_ui;
//^^^^^^^^^^^^^^^^^^^^^^^
CA(const CA& o)
:m_ui(new int(*o.m_ui))
{}
//-----------------------
CA(CA&&)=default;
//-----------------------
public:
//-----------------------
explicit CA(int i):
m_ui(new int(i))
{}
//-----------------------
CA clone() const { return CA(*this);}
//-----------------------
int get(){return *m_ui;}
//-----------------------
};
int main()
{
const CA ca1{42};
const CA ca2 = ca1.clone();
}
|
| | |
Фактически метод clone в этих условиях превращается в абсолютно прозраную прокладку для конструктора копирования. Ровно того же эффекта можно было бы добиться, просто объявив конструкторы копировния и перемещения explicit и оставив их открытыми.
P.S. Метод clone следовало бы объявить константным, а преобразующий конструктор по числу explicit.