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