Под смягченное определение 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
Вот ссылка на идеон показывая полную программу. (Обратите внимание, что ideone использует GCC 4.5)
Итак, мое понимание POD в C ++ 11 ошибочно или GCC 4.6 просто не соответствует современным требованиям C ++ 11?
Структура POD должна быть тривиальным классом (C ++ 11 §9 [class] / 10):
Структура POD — это класс, не являющийся объединением, который является как тривиальным классом, так и классом стандартной компоновки и не имеет нестатических членов-данных типа не-POD-структуры, не-POD-объединения (или массива таких типов).
§9 [class] / 6 определяет, что такое тривиальный класс:
Тривиальный класс — это класс, имеющий тривиальный конструктор по умолчанию и тривиально копируемый.
§12.1 [class.ctor] / 5 определяет, что такое тривиальный конструктор по умолчанию. Начинается:
Конструктор по умолчанию тривиален, если он не предоставлен пользователем и …
Конструктор по умолчанию Foo<T>
предоставляется пользователем и, следовательно, нетривиален. Следовательно, Foo<int>
это не ПОД. Это, однако, стандартное расположение.
По умолчанию объявляет конструктор по умолчанию, делает Foo POD.
то есть
Foo() = default;
explicit Foo(T* obj) : m_data(obj)
{ }