Является ли конструктор Move по умолчанию неопределенным?
Кажется, что вектор будет проверять, если конструктор перемещения помечен как noexcept, прежде чем принимать решение о перемещении или копировании элементов при перераспределении. Является ли конструктор перемещения по умолчанию как noexcept? Я видел следующую документацию, но она не указала это. http://en.cppreference.com/w/cpp/language/move_constructor
Неявно объявленный конструктор перемещения
Если пользовательский ход не задан конструкторы предоставляются для типа класса (struct, class или union), и все следующее верно: нет пользовательской копии конструкторов нет пользовательских операторов присваивания копий нет пользовательских операторов присваивания операторов, нет объявленные пользователем деструкторы, неявно объявленный конструктор перемещения не определены как удаленные из-за условий, описанных в следующем разделе то компилятор объявит конструктор перемещения как встроенную публикацию член его класса с подписью T:: T (T & &). Класс может иметь многопозиционные конструкторы, например. как T:: T (const T &), так и T:: T (T & &). Если имеются определенные пользовательские конструкторы перемещения, пользователь может все еще принудительно генерирует неявно объявленный конструктор перемещения с ключевое слово default.
Ответы
Ответ 1
Я думаю, что ответ 15.4/14 (Исключения):
Конструктор наследования (12.9) и неявно объявленная специальная функция-член (раздел 12) имеют спецификацию исключения. Если f
- наследующий конструктор или неявно объявленный конструктор по умолчанию, конструктор копирования, конструктор переместить конструктор, деструктор, оператор присваивания копии или оператор переадресации, его неявная спецификация исключений указывает тип-id T
тогда и только тогда, когда T
разрешено спецификацией исключения функции, непосредственно вызываемой неявным определением f
s; f
разрешает все исключения, если какая-либо функция, которую он вызывает напрямую, разрешает все исключения, а f
имеет спецификацию исключения noexcept(true)
, если каждая функция, которую он вызывает напрямую, не содержит исключений.
В основном, он делает то, что вы думаете, и конструктор с неявным объявлением перемещается noexcept
всякий раз, когда это возможно.