2013-07-05 2 views
9

Общий шаблон в C++, чтобы сделать копию конструктора частных:Является ли частный конструктор перемещения для предотвращения перемещения?

class A 
{ 
    public: 
     // ... 
    private: 
     A(const A&); 
}; 

Но будет следующий код затем скомпилировать (в C++ 11/14):

A f(); 

auto a = f(); 

Стандарт содержит информацию об автоматическом создании конструкторов перемещения. Я не имею доступа к стандарту или компилятору, который на самом деле генерирует конструкторы перемещения. Мой вопрос: должен ли я писать

class A 
{ 
    public: 
     // ... 
    private: 
     A(const A&); 
     A(const A&&); 
}; 

, чтобы предотвратить перемещение также (и операторов = аналогично)?

+1

Если вы пишете конструктор копирования, он не создает конструктор перемещения. –

+2

Пользовательский экземпляр ctor предотвращает генерацию элементов перемещения. – Xeo

+3

Обратите внимание, что шаблон, на который вы ссылаетесь, предназначен для C++ 98/03, но теперь устарел на C++ 11 благодаря возможности 'delete' конструкторов/операторов присваивания (например,' ClassName (ClassName &&) = delete; 'явно запретить неявный конструктор перемещения). – syam

ответ

13

Но будет следующий код затем скомпилировать (в C++ 11/14):

Нет, это не будет. Наличие объявленного пользователем конструктора копии должно препятствовать неявной генерации конструктора перемещения. В соответствии с пунктом 12.8/9 C++ 11 Стандарт на:

Если определение класса X не явно объявить конструктор перемещения, один будет неявно объявлен , как по умолчанию, если и только если

- X не имеет пользовательскую объявленную конструктор копирования,

- X не имеет оператора присваивания копии пользователя заявил,

- X не имеет оператора присваивания перемещения пользователя объявленные,

- X не имеет пользовательскую объявленную деструктор и

- конструктор шага не будут неявно определяются как удаленные.

+0

Отлично! Еще раз я впечатлен SO! :-) – Petter

+0

@Ben: Рад, что это помогло :) –

Смежные вопросы