2
struct A
{
  int i;
};

struct B
{
 B(){} 
 int i;
}

こんにちは、みんな

「PODは、定義上、ユーザー定義のコンストラクターを持つことができないPlain Old Data型を意味する」ことを知っています。しかし、「定義にユーザー定義の default-con がある」場合に、このルールが有効な理由がわかりません。

メモリ レイアウトに違いはありません。タイプ A は POD であり、タイプ B ではないのはなぜですか?

4

3 に答える 3

3

PODの概念は、単純な概念と標準的なレイアウトの概念に分割されています。これらのプロパティは、標準の型特性を通じてクエリできます。

クラスBは自明ではないため、POD ではありません。ユーザー提供のデフォルトコンストラクターがあるため、簡単ではありません。それを省略するか、新しい C++11=default構文を使用してください。

#include <type_traits>
#include <iostream>
#include <ios>

struct A
{
  int i;
};

struct B
{
 B(){} 
 int i;
};

struct C
{
 C() = default;
 int i;
};

int main()
{
    std::cout << std::boolalpha << std::is_pod<A>::value << " ";
    std::cout << std::boolalpha << std::is_trivial<A>::value << " ";
    std::cout << std::boolalpha << std::is_standard_layout<A>::value << "\n";

    std::cout << std::boolalpha << std::is_pod<B>::value << " ";
    std::cout << std::boolalpha << std::is_trivial<B>::value << " ";
    std::cout << std::boolalpha << std::is_standard_layout<B>::value << "\n";

    std::cout << std::boolalpha << std::is_pod<C>::value << " ";
    std::cout << std::boolalpha << std::is_trivial<C>::value << " ";
    std::cout << std::boolalpha << std::is_standard_layout<C>::value << "\n";
}

オンライン出力:

true true true
false false true
true true true
于 2013-07-17T08:51:18.557 に答える