Я заинтригован следующим абзацем из стандарта (§3.9 / 4 ISO / IEC 14882: 2011 (E)):
представление объекта объекта типа
T
последовательность Nunsigned char
объекты, захваченные объектом типаT
, где N равняетсяsizeof(T)
, представление значения объекта представляет собой набор битов, которые содержат значение типаT
, Для тривиально копируемых типов представление значения представляет собой набор битов в представлении объекта, который определяет значение, который является одним дискретным элементом определенного реализацией набора значений.42
Я понимаю что представление объекта а также представление значения различаются, чтобы позволить некоторому представлению объекта не принимать участие в значении объекта (например, заполнение). Я не совсем понимаю о тривиально копируемых типах. Разве нетривиально копируемые типы не имеют значений? Может ли часть представления значения нетривиально копируемого типа существовать вне его представления объекта?
Примечание 42 объясняет:
Предполагается, что модель памяти C ++ совместима с языком программирования ISO / IEC 9899 C.
Я до сих пор не понимаю, почему предыдущее утверждение специально предназначено только для тривиально копируемых типов. Каково значение этого?
Стандартный пример — это класс, который управляет ресурсом:
struct Foo
{
Bar * p;
Foo() : p(new Bar) { }
~Foo() { delete p; }
// copy, assign
};
Объект типа Foo
имеет значение, но это значение не может быть скопировано путем копирования представления объекта (которое является просто значением p
в этом случае). Копирование объекта типа Foo
требует копирования семантика класса, которые говорят «объект владеет pointee «. Подходящая копия, таким образом, требует соответствующего, определенного пользователем конструктора копии:
Foo::Foo(Foo const & rhs) : p(new Bar(*rhs.p)) { }
Теперь объектное представление объекта типа Foo
отличается от представления объекта копии такого объекта, хотя они имеют одинаковое значение.
Напротив, значение int
такой же, как у другого int
как только представления объектов совпадают. (Это достаточное, хотя и не обязательное условие из-за заполнения.)
Других решений пока нет …