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 6

2 ответа:

Структура POD должна быть тривиальным классом (C++11 §9 [class]/10):

POD-структура-это класс без объединения, который является одновременно тривиальным классом и классом стандартной компоновки и не имеет нестатических элементов данных типа non-POD struct, non-POD union (или массив таких типов).

§9 [class]/6 определяет, что такое тривиальный класс:

Тривиальный класс-это класс, который имеет тривиальный конструктор по умолчанию и тривиально копируется.

§12.1 [класс.ctor] / 5 определяет что такое тривиальный конструктор по умолчанию. Она начинается так:

Конструктор по умолчанию тривиален, если он не предоставлен пользователем и...

Конструктор по умолчанию Foo<T> предоставляется пользователем и поэтому нетривиален. Следовательно, Foo<int> не является POD. Это, однако, стандартная компоновка.

Default объявляя конструктор default, делает Foo POD. то есть

Foo() = default;
explicit Foo(T* obj) : m_data(obj)
{ }

Http://ideone.com/vJltmA