Информация об изменениях

Сообщение Re[5]: Доступ к copy-ctor через отдельный метод от 02.04.2022 17:24

Изменено 02.04.2022 18:11 rg45

Re[5]: Доступ к copy-ctor через отдельный метод
Здравствуйте, _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 и оставив их открытыми.
Re[5]: Доступ к copy-ctor через отдельный метод
Здравствуйте, _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 и оставив их открытыми.