Я тестировал со ссылками rvalue и семантикой перемещения и хочу убедиться, что я понимаю, когда копия должна быть удалена, а когда она должна следовать семантике перемещения.
Учитывая следующее
class NRVCA
{
public:
NRVCA(int x):
{}
NRVCA(const NRVCA & Rhs)
{}
NRVCA& operator=(const NRVCA& dref)
{}
};
NVCRA GetATemp()
{
return NVCRA(5);
}
NVCRA GetACopy()
{
NVCRA ret(5);
...
return ret;
}
int main()
{
//This call will be elided allays and invoke the single param constructor
NVCRA A = GetATemp();
//This call will be a traditional copy the complier may elide this
// if so the work will be done inline
NVCRA B = GetACopy();
}
В этом случае семантика перемещения не играет никакой роли, и единственное отличие от C ++ 03 в c ++ 11 состоит в том, что вместо того, чтобы компилятору было разрешено исключать, они обязаны исключаться.
Так
Вопрос 1. В каких случаях я гарантирую, что конструктор копирования будет или не будет удален.
Вопрос 2. Есть ли способ заставить компилятор не исключаться.
Вопрос 3. Есть ли логическая причина, по которой я бы не хотел, чтобы компилятор делал это, предполагая, что у вас есть логически согласованные операции копирования.
Вопрос 4. Если я определю конструктор перемещения, перемещение произойдет в тех случаях, когда копия все равно не удаляется. Должно ли это повлиять на мой дизайн занятий.