Ответ 1
"нетривиальная функция" является дополнением к "тривиальной специальной функции-члена". Существуют определения того, что тривиальный и нетривиальный конструктор default/copy/move, оператор присваивания копирования/перемещения или деструктор - это признаки, которые относятся только к специальным функциям-членам и определяют, например, их нужно вызывать при определенных обстоятельствах.
Определения для них можно найти в главе § 12.
Конструктор по умолчанию, §12.1/4:
Конструктор по умолчанию является тривиальным, если он не предоставляется пользователем, и если:
- его класс не имеет виртуальных функций (10.3) и нет виртуальных базовых классов (10.1) и
- нет нестатического элемента данных его класса, который имеет инициализатор скобок или равный, и
- все прямые базовые классы его класса имеют тривиальные конструкторы по умолчанию, а
- для всех нестатических членов данных своего класса, которые относятся к типу класса (или его массиву), каждый из таких классов имеет тривиальное значение по умолчанию конструктор.
В противном случае конструктор по умолчанию является нетривиальным.
Копировать/перемещать конструкторы, §12.8/12:
Конструктор копирования/перемещения для класса X тривиален, если он не является предоставляемый пользователем, его список параметров-параметров эквивалентен parameter-type-list неявного объявления, а если
- class
X
не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1) и- class
X
не имеет нестатических членов данных типа volatile-qualified и- конструктор, выбранный для копирования/перемещения каждого подобъекта прямого базового класса, тривиален и
- для каждого нестатического элемента данных
X
, который относится к типу класса (или его массиву), конструктор, выбранный для копирования/перемещения этого элемента, тривиальным;в противном случае конструктор copy/move не является тривиальным.
Операция копирования/перемещения задания, §12.8/26:
Оператор присваивания копирования/перемещения для класса
X
тривиален, если он не предоставляемый пользователем, его список параметров-параметров эквивалентен parameter-type-list неявного объявления, а если
- class
X
не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1) и- class
X
не имеет нестатических членов данных типа volatile-qualified и- оператор присваивания, выбранный для копирования/перемещения каждого прямого базового класса
- для каждого нестатического элемента данных
X
, который относится к типу класса (или его массиву), оператор присваивания, выбранный для копирования/перемещения этого член тривиален;иначе оператор присваивания копирования/перемещения нетривиален.
Деструктор, §12.4/5:
Деструктор тривиален, если он не предоставляется пользователем, и если:
- деструктор не является виртуальным,
- все прямые базовые классы его класса имеют тривиальные деструкторы, а
- для всех нестатических членов данных своего класса, которые относятся к типу класса (или его массиву), каждый такой класс имеет тривиальный деструктор.
В противном случае деструктор является нетривиальным