C ++:has_trivial_X类型特征

时间:2009-10-05 10:49:02

标签: c++ types c++11

boost库,似乎即将推出的C ++ 0x标准,定义了各种类型的特征模板,以区分具有普通构造函数,复制构造函数,赋值或析构函数的对象与不具有普通构造函数,复制构造函数,赋值或析构函数的对象。其中一个最重要的用途是优化某些类型的算法,例如通过使用memcpy。

但是,我不明白所有各种has_trivial_X模板之间真正的实际区别。 C ++标准仅定义了我们关注的两大类型:POD和非POD。如果类型具有已定义的构造函数,复制构造函数,赋值运算符或析构函数,则该类型为非POD。换句话说,任何不是内置类型或内置类型的C结构的东西都不是POD。

那么区分例如has_trivial_assign和has_trivial_constructor有什么意义呢?如果一个对象有一个非平凡的赋值运算符或一个非平凡的构造函数,它就不是一个POD。那么在什么情况下知道一个对象有一个简单的赋值运算符,但是一个非平凡的构造函数呢?

换句话说,为什么不定义一个类型 - 特征模板is_pod<T>,并完成它?

1 个答案:

答案 0 :(得分:6)

POD类型定义在C ++ 0A中放宽了。

一个类型可能有一个非平凡的构造函数,但可能有一个普通的赋值运算符。

E.g。

struct X
{
    X() : y( -1 ) {}
    X( int k, int v ) : y( k * v ) {}

    int y;
};

X可以是'memcopy',但不是简单的构造。