Какова была цель смелого текста ниже в [class.copy]/12 на C++14?
[class.copy]/12 в C++14:
Конструктор копирования / перемещения для класса X тривиален, если он не предоставлен пользователем, его список параметров-типов эквивалентен списку параметров-типов неявного объявления, и если
- (12.1) - класс X не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1), и
- (12.2) - класс X не имеет нестатических членов данных типа volatile-qualified и
- (12.3) - конструктор, выбранный для копирования / перемещения каждого подобъекта прямого базового класса, тривиален, и
- (12.4) - для каждого нестатического члена данных X, который имеет тип класса (или его массив), конструктор, выбранный для копирования / перемещения этого члена, тривиален;
в противном случае конструктор копирования / перемещения нетривиален.
Я вижу, что приведенное выше предложение было стерто в N4606, но я не смог найти ничего в активных выпусках стандартного базового языка C++, редакция 96, чтобы оправдать его удаление из C++14.
1 ответ
Это результат CWG 2171. Удаленный текст меняет значение только в одном случае:
struct X {
X(X& ) = default; // not user-provided
// parameter-type-list differs from implicit declaration's X const&
// wasn't trivial before, is trivial now
};
Но является ли этот конструктор копирования тривиальным, это отдельный вопрос о том, является ли он фактически вызываемым или нет, поэтому исходный текст считался несовместимым с обычным намерением стандарта и, следовательно, был удален.