Понимаю, что вопрос уже навяз в зубах, но поиск ничего конкретного не дал.
Вот полное описание объекта:
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-типом. Это совершенно логично и не вызывает ни малейших возражений. Но просто запрет каких
бы то ни было конструкторов — это уже какой-то параноидальный объектно-ориентированный шовинизм