Простыми словами «тривиальная» специальная функция-член буквально означает функцию-член, которая делает свою работу очень простым способом. «Прямой способ» означает различную вещь для различных видов специальных функций-членов.
Для конструктора по умолчанию и деструктора, который является «тривиальным», означает буквально «ничего не делать». Для оператора copy-constructor и copy-assign термин «тривиальный» означает буквально «эквивалентно простому необработанному копированию памяти» (например, копирование с memcpy
).
Если вы сами определяете конструктор, считается нетривиальным, даже если он ничего не делает, поэтому тривиальный конструктор должен быть неявно определен компилятором.
Чтобы специальная функция-член удовлетворяла вышеуказанным требованиям, класс должен иметь очень упрощенную структуру, он не должен содержать никаких скрытых инициализаций при создании или уничтожении объекта или каких-либо скрытых дополнительных внутренних манипуляции при копировании.
Например, если класс имеет виртуальные функции, для создания объектов этого класса потребуются дополнительные скрытые инициализации (инициализировать таблицу виртуальных методов и т. д.), поэтому конструктор для этого класса не будет считаться тривиальным.
В другом примере, если класс имеет виртуальные базовые классы, то каждый объект этого класса может содержать скрытые указатели, указывающие на другие части одного и того же объекта. Такой самореферентный объект не может быть скопирован простой процедурой копирования необработанной памяти (например, memcpy
). Дополнительные манипуляции будут необходимы для правильной повторной инициализации скрытых указателей в копии. По этой причине оператор копирования и оператор присваивания копии для этого класса не будут квалифицироваться как тривиальные.
По понятным причинам это требование является рекурсивным: все подобъекты класса (базы и нестатические элементы) должны также имеют тривиальные конструкторы.