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