Документирование того, что мой тип C ++ является memcopyable и n oop разрушаемо - PullRequest
1 голос
/ 10 марта 2020

Предположим, я написал тип, похожий на static_string (просто пара символов size_t и N, где N - параметр шаблона int). Таким образом, мой тип может быть безопасно запечатан и нет необходимости запускать деструктор. Но у него есть конструктор копирования, предоставленный пользователем, поэтому он не определяется как тривиально копируемый языком C ++.

Я хотел бы сказать пользователям моего типа, что они могут запоминать мой тип и что нет необходимости запускать деструктор .

Я всегда предполагал, что могу просто специализировать type_traits, но недавно я узнал, что это UB.

Если нет способа сделать это с чертами типа: есть ли названная концепция в C ++ 20, что мой тип удовлетворяет так, по крайней мере, в комментарии я могу использовать это вместо слов?

PS Я знаю, что писать подобные типы - плохая идея, но существуют некоторые варианты использования: оптимизация, общая память (где вы не хотите, чтобы строки занимали кучу c).

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

Так что мой тип может быть безопасно запечатан, и нет необходимости запускать деструктор. Но он имеет предоставленный пользователем конструктор копирования, поэтому он не определяется как легко копируемый языком C ++.

Это противоречие. Что касается языка C ++, то если ваш тип не TriviallyCopyable, то он не «безопасно записан». Если memcopying эквивалентен копии, то это должно означать, что копирование объекта эквивалентно memcpy . Если две операции одинаковы, то они должны быть одинаковыми .

Нет способа разрешить это противоречие, не жертвуя одной из них. Либо делать все копирование эквивалентными (memcpy и copy constructor / assignment), либо memcpy не разрешается.

Вопрос заключается в следующем: насколько важно тривиальное копируемое копирование по сравнению с оптимизацией только копирования символов, которые на самом деле имеют значение в конструкторе копирования / операторе присваивания? Вы не можете иметь оба. Лично я бы сказал, что строки stati c никогда не должны быть достаточно большими, чтобы стоимость простого копирования всего этого материала имела большое значение. И в тех редких случаях, когда это действительно важно, предоставьте специальную функцию для копирования.

0 голосов
/ 10 марта 2020

Ответ Нет. В C ++ 20 нет атома c с именем concept, который удовлетворял бы вашему типу. Конечно, вы можете определить пользовательский concept, который соответствует вашему типу. Но это не то, что вы хотите. Поскольку вопрос касается документации, я советую вам использовать слова (а не код) в качестве комментария.

...