Снова конструкторы и POD-типы
От: McSeem2 США http://www.antigrain.com
Дата: 25.07.05 23:48
Оценка: 1 (1)
Понимаю, что вопрос уже навяз в зубах, но поиск ничего конкретного не дал.
Вот полное описание объекта:
struct point
{
   int x,y;
   point() {}
   point(int x_, int y_) : x(x_), y(y_) {}
};


Вопрос первый — является ли данный объект POD-типом? Согласно стандарту — не является, поскольку имеет явные конструкторы.
Вопрос второй — допустимо ли копировать данный объект целиком при помощи memcpy (хранить его в специализированном контейнере для POD-типов)?
Вопрос третий. Если не допустимо, то каково обоснование этому? Класс не содержит и не может содержать никаких неявных данных, типа VMT. Так же не имеет права иметь явный деструктор. Он не может наследоваться от чего-либо и не может иметь производных классов. Имеется так же запрет на какие-либо исключения. В нем даже нет никаких указателей — только базовые типы (это все — начальные условия). И только лишь от наличия одного конструктора, имеющего чисто утилитарное назначение (как синтаксический сахар) объект нельзя копировать при помощи memcpy? Это же маразм!
Вопрос четвертый. Где-либо, когда-либо, кто-либо сталкивался с реальными проблемами на практике, при "безбашенном" копировании подобных объектов при помощи memcpy (или memmove)? По-моему, таких проблем никогда не было и не будет.
Вопрос пятый — как следствие из четвертого. Возможна ли в принципе такая ситуация (при оговоренных выше ограничениях), что добавление простого конструктора изменит sizeof объекта?

То есть, я не вижу ни малейшего rationale подобных запретов. Да, как только в конструкторе аллокируется какая-либо память (а в деструкторе освобождается), объект сразу перестает быть POD-типом. Это совершенно логично и не вызывает ни малейших возражений. Но просто запрет каких бы то ни было конструкторов — это уже какой-то параноидальный объектно-ориентированный шовинизм
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.