C ++ 11 is_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

Вот ссылка на идеон показывая полную программу. (Обратите внимание, что ideone использует GCC 4.5)

Итак, мое понимание POD в C ++ 11 ошибочно или GCC 4.6 просто не соответствует современным требованиям C ++ 11?

6

Решение

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

Структура POD — это класс, не являющийся объединением, который является как тривиальным классом, так и классом стандартной компоновки и не имеет нестатических членов-данных типа не-POD-структуры, не-POD-объединения (или массива таких типов).

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

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

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

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

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

6

Другие решения

По умолчанию объявляет конструктор по умолчанию, делает Foo POD.
то есть

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

http://ideone.com/vJltmA

2

По вопросам рекламы [email protected]