boost库,似乎即将推出的C ++ 0x标准,定义了各种类型的特征模板,以区分具有普通构造函数,复制构造函数,赋值或析构函数的对象与不具有普通构造函数,复制构造函数,赋值或析构函数的对象。其中一个最重要的用途是优化某些类型的算法,例如通过使用memcpy。
但是,我不明白所有各种has_trivial_X模板之间真正的实际区别。 C ++标准仅定义了我们关注的两大类型:POD和非POD。如果类型具有已定义的构造函数,复制构造函数,赋值运算符或析构函数,则该类型为非POD。换句话说,任何不是内置类型或内置类型的C结构的东西都不是POD。
那么区分例如has_trivial_assign和has_trivial_constructor有什么意义呢?如果一个对象有一个非平凡的赋值运算符或一个非平凡的构造函数,它就不是一个POD。那么在什么情况下知道一个对象有一个简单的赋值运算符,但是一个非平凡的构造函数呢?
换句话说,为什么不定义一个类型 - 特征模板is_pod<T>
,并完成它?
答案 0 :(得分:6)
POD类型定义在C ++ 0A中放宽了。
一个类型可能有一个非平凡的构造函数,但可能有一个普通的赋值运算符。
E.g。
struct X
{
X() : y( -1 ) {}
X( int k, int v ) : y( k * v ) {}
int y;
};
X可以是'memcopy',但不是简单的构造。