Текущий черновик стандарта C ++ (март 2019 г.) имеет следующий абзац ([basic.types] p.4) (выделено мной):
Представление объекта объекта типаT - это последовательность из N беззнаковых объектов char, занятых объектом типа T, где N равно sizeof (T).Представление значения объекта типа T - это набор битов, которые участвуют в представлении значения типа T. Биты в представлении объекта, которые не являются частью представления значения, являются битами заполнения. Для тривиально копируемых типов представление значения - это набор битов в представлении объекта, который определяет значение, которое является одним дискретным элементом набора значений, определенного реализацией .
Почему выделенное предложение ограничено тривиально копируемыми типами?Это потому, что некоторые биты из представления значения нетривиально копируемого объекта могут быть вне его представления объекта ? Этот ответ , а также этот подразумевают это.
Однако в ответах, связанных выше, концептуальное значение объекта основано на семантике, введенной пользователем.В примере из первого связанного ответа:
class some_other_type
{
int a;
std::string s;
};
пользователь решает, что значение объекта типа some_other_type
включает символы, принадлежащие строке s
.
Я пытался придумать примеры, в которых тот факт, что некоторые биты объекта (которые не легко копируются ) представление значения находятся за пределами его представление объекта является неявным (реализация должна делать это, пользователь не решает это произвольно).
Один из примеров, который я привел, заключается в том, что представление значения базыподобъект класса с виртуальными методами может включать биты из представления объекта всего объекта, которому он принадлежит, поскольку подобъект базового класса может вести себя по-разному (может «иметь другое значение») по сравнению с ситуацией, в которойэто был бы сам объект целиком.
Еще один пример, который, как я думаю, это тот факт, что vtable также может бытьr * значения объекта, чей указатель vtable указывает на него.
Верны ли эти примеры?Есть ли другие примеры?
Было ли выделенное предложение введено стандартным комитетом из-за того, что семантическое «значение» объекта может быть решено пользователем (как в двух связанных ответах), или потому чтоо том, что реализации могут решить (или могут быть вынуждены) сделать это, или оба?
Спасибо.