C++11-pod с GCC 4.6
В соответствии с расслабленным определением POD В C++11, насколько я понимаю, следующая структура считается POD:
template <class T>
struct Foo
{
Foo()
{ }
explicit Foo(T* obj) : m_data(obj)
{ }
T* m_data;
};
Однако, используя GCC 4.6 и компиляцию с флагом -std=c++0x
, Если я скажу:
std::cout << std::boolalpha << std::is_pod<Foo<int>>::value << std::endl;
Выводит:
false
Вот пример: ideon link показываю полную программу. (Обратите внимание, что ideone использует GCC 4.5)
Итак, является ли мое понимание Pod в C++11 ошибочным, или GCC 4.6 просто не соответствует современным требованиям с точки зрения Соответствие C++11?
2 ответа:
Структура POD должна быть тривиальным классом (C++11 §9 [class]/10):
§9 [class]/6 определяет, что такое тривиальный класс:POD-структура-это класс без объединения, который является одновременно тривиальным классом и классом стандартной компоновки и не имеет нестатических элементов данных типа non-POD struct, non-POD union (или массив таких типов).
Тривиальный класс-это класс, который имеет тривиальный конструктор по умолчанию и тривиально копируется.
§12.1 [класс.ctor] / 5 определяет что такое тривиальный конструктор по умолчанию. Она начинается так:
Конструктор по умолчанию тривиален, если он не предоставлен пользователем и...
Конструктор по умолчанию
Foo<T>
предоставляется пользователем и поэтому нетривиален. Следовательно,Foo<int>
не является POD. Это, однако, стандартная компоновка.