Можно ли определить эквивалент «идиома перемещения и обмена» в C ++ 03 - PullRequest
3 голосов
/ 19 февраля 2020

Я привязан к C ++ 03 , и у меня есть не копируемый объект (например, содержащий ресурс).

Мне нужно использовать move-and- Поменяйте семантику , чтобы иметь возможность делать что-то похожее и избегать копий:

MyClass returnMyClass(void)
{
    MyClass temp;
    // fill 'temp' members with actual data
    return temp;
}

int main(void)
{
    MyClass test;
    test = returnMyClass(); // need to avoid copies
}

Возможно ли соблюдать все эти требования в C ++ 03?

Это в основном то же самое случай это , но для C ++ 03.


Чтобы поставить вопрос другими словами:

Учитывая не копируемые класс MyClass, возможно ли как-то в C ++ 03 сделать MyClass test = returnMyClass();?

Боюсь, ответ просто нет , но может быть, мне не хватает какой-то хитрости.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

В семантике ходов нет магов c. Это просто очередная перегрузка. Ссылка на rvalue - приятное удобство, которое на самом деле не является обязательным.

template <class T>
struct rref { 
    rref (T& t) : t(t) {}
    T& t; 
};

template<class T>
rref<T> move(const T& t) {
   return rref<T>(const_cast<T&>(t));
}

// you now can do a "move ctor"
class Foo {
   Foo(rref<Foo>) { ... }
};

Теперь вам также нужно NRVO, чтобы это сработало. Это не гарантируется стандартом, но обеспечивается практически каждой реализацией. Чтобы это действительно произошло, вы можете объявить, но не определить копию ctor.

Полная рабочая демонстрация

0 голосов
/ 19 февраля 2020

Если вы можете инициализировать свой объект test при объявлении, вы сможете избежать копирования, потому что будет выполнено копирование.

class MyClass
{
  public:
    MyClass(){std::cout << "Default Constructor" << std::endl;}
    MyClass(const MyClass &){std::cout << "CPYConstructor" << std::endl;}
    ~MyClass() {std::cout << "Destructor" << std::endl;}

};


MyClass returnMyClass(void)
{
    MyClass temp;
    // fill 'temp' members with actual data
    return temp;
}

int main(void)
{
    MyClass test = returnMyClass(); // need to avoid copies
}

Вывод:

Default Constructor
Destructor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...