struct A
{
int i;
};
struct B
{
B(){}
int i;
}
こんにちは、みんな
「PODは、定義上、ユーザー定義のコンストラクターを持つことができないPlain Old Data型を意味する」ことを知っています。しかし、「定義にユーザー定義の default-con がある」場合に、このルールが有効な理由がわかりません。
メモリ レイアウトに違いはありません。タイプ A は POD であり、タイプ B ではないのはなぜですか?
struct A
{
int i;
};
struct B
{
B(){}
int i;
}
こんにちは、みんな
「PODは、定義上、ユーザー定義のコンストラクターを持つことができないPlain Old Data型を意味する」ことを知っています。しかし、「定義にユーザー定義の default-con がある」場合に、このルールが有効な理由がわかりません。
メモリ レイアウトに違いはありません。タイプ A は POD であり、タイプ B ではないのはなぜですか?
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