на Гонки легкости на орбите уточнение, я сузил свой пост.
После прочтения этой статьи: Правило нуля,
Я понял больше всего, но все еще хочу решить некоторые неясные вопросы, которые у меня есть:
1. Глядя на эту фразу:
Если определение класса X явно не объявляет конструктор перемещения, он будет неявно объявлен как дефолтный, если и только если:
X не имеет объявленного пользователем конструктора копирования, а также
X не имеет заявленного пользователем оператора копирования,
X не имеет объявленного пользователем оператора назначения перемещения,
X не имеет объявленного пользователем деструктора, а также
Конструктор перемещения не будет неявно определен как удаленный.
Должны ли сосуществовать все 5 операторов (разделять отношение «и») или только некоторые из них (разделять отношение «или»)?
2. Какие «пользователь объявлена«конструктор копирования \ оператор присваивания копии … означает?
объявляет ли он (любой из приведенного выше списка) в файле .h, но не реализует его, объявленным пользователем?
объявляет это (любой из списка выше) в файле .h и указывает «= удалено» или же «= по умолчанию«считается объявленным пользователем?
объявляет его (любой из приведенного выше списка) в файле .h с пустыми браслетами, {}, считается объявленным пользователем?
С уважением,
Etay
Объявленный пользователем конструктор — это конструктор, который был написан программистом, а не добавлен компилятором. Определяемый пользователем является противоположностью по умолчанию или неявным в этом случае.
Ваш класс будет иметь неявный конструктор перемещения по умолчанию, если в вашем классе не произойдет ни одно из этих условий. Итак, это «минус и». Ни один из них не должен получить неявный конструктор перемещения по умолчанию.
Во всех ваших упомянутых случаях конструктор используется объявленным даже при удалении.
Причина этих правил заключается в ретро-совместимости с пре-C ++ — 11. Когда пользователь объявляет конструктор копирования, ему также отправляются временные данные. Если вы перейдете к компилятору C ++ 11, и конструкторы перемещения будут без разбора неявными, поведение изменится. Вызовы, которые были раньше конструктору копирования, теперь переходят к фантомному конструктору перемещения, о котором пользователь мог не знать.
Таким образом, каждый раз, когда компилятор видит конструктор копирования или оператор присваивания (то есть класс управляет своими собственными ресурсами), откат поведения до версии до C ++ 11 и конструкторы перемещения не рассматриваются.
Других решений пока нет …