Какова была цель смелого текста ниже в [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
};

Но является ли этот конструктор копирования тривиальным, это отдельный вопрос о том, является ли он фактически вызываемым или нет, поэтому исходный текст считался несовместимым с обычным намерением стандарта и, следовательно, был удален.

Другие вопросы по тегам