Так вы можете транспонировать кортеж 2x4 в кортеж 4x2.
>>> tuple(zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)]))
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
Простыми словами «тривиальная» специальная функция-член буквально означает функцию-член, которая делает свою работу очень простым способом. «Прямой способ» означает различную вещь для различных видов специальных функций-членов.
Для конструктора по умолчанию и деструктора, который является «тривиальным», означает буквально «ничего не делать». Для оператора copy-constructor и copy-assign термин «тривиальный» означает буквально «эквивалентно простому необработанному копированию памяти» (например, копирование с memcpy
).
Если вы сами определяете конструктор, считается нетривиальным, даже если он ничего не делает, поэтому тривиальный конструктор должен быть неявно определен компилятором.
Чтобы специальная функция-член удовлетворяла вышеуказанным требованиям, класс должен иметь очень упрощенную структуру, он не должен содержать никаких скрытых инициализаций при создании или уничтожении объекта или каких-либо скрытых дополнительных внутренних манипуляции при копировании.
Например, если класс имеет виртуальные функции, для создания объектов этого класса потребуются дополнительные скрытые инициализации (инициализировать таблицу виртуальных методов и т. д.), поэтому конструктор для этого класса не будет считаться тривиальным.
В другом примере, если класс имеет виртуальные базовые классы, то каждый объект этого класса может содержать скрытые указатели, указывающие на другие части одного и того же объекта. Такой самореферентный объект не может быть скопирован простой процедурой копирования необработанной памяти (например, memcpy
). Дополнительные манипуляции будут необходимы для правильной повторной инициализации скрытых указателей в копии. По этой причине оператор копирования и оператор присваивания копии для этого класса не будут квалифицироваться как тривиальные.
По понятным причинам это требование является рекурсивным: все подобъекты класса (базы и нестатические элементы) должны также имеют тривиальные конструкторы.
Уже есть правильные ответы, но вот цитата из стандарта (которую я искал, когда я наткнулся на это сообщение):
(§12.1 / 5) Конструктор по умолчанию тривиально, если он не предоставляется пользователю и если: - его класс не имеет виртуальных функций (10.3) и не имеет виртуальных базовых классов (10.1), и - нет нестатического члена данных его класса имеет скобку или равный- initializer, и - все прямые базовые классы его класса имеют тривиальные конструкторы по умолчанию, и - для всех нестатических членов данных своего класса, которые относятся к типу класса (или его массиву), каждый такой класс имеет тривиальный конструктор по умолчанию.
blockquote>Это из C ++ 11. В C ++ 03 отсутствует второй элемент и используется фраза , неявно объявленная вместо , не предоставляемая пользователем . В противном случае это идентично.
Обратите внимание, что эта спецификация охватывает только тривиальные конструкторы по умолчанию. Атрибут слова тривиальный также может использоваться в разных контекстах, например. копировать конструкторы.
Конструктор класса A является тривиальным , если все верно:
default
, как показано на вашей ссылке. – AnT 10 October 2010 в 17:02