Недавно я столкнулся с этим вопросом. Моя цель — понять, как компилятор C++ просматривает определения структур, содержащие стандартные библиотечные контейнеры, такие как std::vector.
В ответе Бена Фойгта на связанный вопрос цитируется следующее из стандарта C++0x:
....
Тривиальный класс — это класс, который имеет простой конструктор по умолчанию (12.1) и может быть легко скопирован.
[ Примечание. В частности, тривиально копируемый или тривиальный класс не имеет виртуальных функций или виртуальных базовых классов. — конец примечания ]
Класс стандартного макета — это класс, который:
- не имеет нестатических членов данных класса нестандартного макета (или массива таких типов) или ссылки,
....
Я почти уверен, что выделенный жирным шрифтом текст означает, что следующее поведение не определено
struct A
{
std::vector< SomeType > myVec;
int myC;
A( int c ) : myC : (c) {}
};
int main( void )
{
A one( 1 );
A two( 2 );
SomeType k, z;
one.myVec.push_back( k );
two.myVec.push_back( z );
memcpy( &two, &one, sizeof( A ) ); // bad juju
}
То же самое относится и к любому типу из стандартной библиотеки, включая более простые типы, такие как std::string
. Это может быть связано с характером дизайна библиотеки, учитывая широкое использование наследования и программирования шаблонов.
Таким образом, хотя struct A
будет напоминать тип POD, тот факт, что он содержит этот стандартный библиотечный тип, автоматически делает его недействительным из этой категории с точки зрения компилятора.
Верны ли мои предположения?
A
нельзя просто скопировать. И ниstd::vector
, ниstd::string
я бы не назвал простыми. Некоторые стандартные библиотечные классы гарантированно легко копируются. - person T.C.   schedule 27.11.2014A
нельзя просто скопировать, и это является важным требованием. - person ildjarn   schedule 27.11.2014std::string
, например, пришла откуда-то еще. - person MSalters   schedule 27.11.2014My goal is to understand how the C++ compiler views struct definitions
Это предложение не имеет для меня особого смысла. Очевидно, что компиляторы интерпретируют стандарт по-разному и подвержены ошибкам. Аналогично сas far as the compiler is concerned.
Если вам нужен ответ, который касается стандарта (а не конкретной реализации), зачем вы привносите в это компилятор? Кроме того, стандартная библиотека C++, компилятор и реализации стандартной библиотеки — это три разные вещи. Я думаю, что ваш вопрос нужно переформулировать. - person   schedule 27.11.2014