2017-01-09 8 views
4

При определении класса выполняется следующее:Конструктор перемещения по умолчанию, принимающий параметр const

T(const T&&) = default; 

Я читал о конструкторах хода here и объясняет, как по умолчанию все еще может быть неявно объявлено:

Класса может иметь несколько конструкторов перемещения, например, оба T::T(const T&&) и T::T(T&&). Если присутствуют определенные пользовательские конструкторы перемещения, пользователь может по-прежнему принудительно генерировать неявно объявленный конструктор перемещения с ключевым словом по умолчанию.

В нижней части страницы он упоминает отчет дефект РГС 2171:

РГС 2171 C++ 14
X(const X&&) = default был нетривиальным, тривиальное.

Возможно, запись wiki имеет ошибку, а CWG 2171 ссылается только на конструктор копирования, а не на конструктор перемещения?

+0

Почему это неправда? –

+0

Действительно, но бесполезно, я бы сказал - как бы вы перешли от него? – SergeyA

+1

@LightnessRacesinOrbit I [не удалось найти компилятор] (https://godbolt.org/g/MCdyqw), который скомпилирует его. – wally

ответ

2

Из проекта n4296:

8.4.2.1 Явное-дефолтных функций:

функция, которая явно должна дефолте

(1,1) - быть специальная функция,

(1.2) - имеют такой же заявленный тип функции (за исключением, возможно, , отличающийся от ref-qualifiers и за исключением того, что в случае экземпляра-конструктора или оператора присваивания копии тип параметра может быть «ссылка на неконстантный Т», где T - это имя элемента класс функции) as если оно было объявлено неявно и

(1.3) - не имеют аргументов по умолчанию.

12.8.10 Копирование и перемещение объектов класса:

неявно объявленная движение конструктор для класса X будет иметь вид X :: X (X & &)


Как следствие, line:

T(const T&&) = default; 

недействителен, поскольку неявно объявленное конструктивное движение r имеет вид:

T(T&&) 

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

  • Нет связанных вопросов^_^