7

C++11での POD の定義が緩和されているため、次の構造体が 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 を使用することに注意してください)

では、C++11 の POD に関する私の理解は間違っているのでしょうか、それとも GCC 4.6 は単に C++11 準拠に関して最新ではないのでしょうか?

4

2 に答える 2

6

POD 構造体は自明なクラスでなければなりません (C++11 §9[class]/10):

POD 構造体は、自明クラスと標準レイアウト クラスの両方である非共用体クラスであり、型非 POD 構造体、非 POD 共用体 (またはそのような型の配列) の非静的データ メンバーはありません。

§9[class]/6 は、自明なクラスとは何かを定義しています。

自明なクラスは、自明なデフォルト コンストラクターを持ち、自明にコピー可能なクラスです。

§12.1[class.ctor]/5 では、自明なデフォルト コンストラクタとは何かを定義しています。始まります:

ユーザーが提供しない場合、デフォルトのコンストラクターは簡単です...

のデフォルトのコンストラクターFoo<T>はユーザー提供であるため、自明ではありません。したがって、Foo<int>PODではありません。ただし、これは標準的なレイアウトです。

于 2013-01-27T03:24:38.563 に答える
2

デフォルトのコンストラクタを宣言し、Foo を POD にします。すなわち

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

http://ideone.com/vJltmA

于 2013-01-27T08:37:27.880 に答える