2009-10-05 111 views
6

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

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

那么有什么区别,例如,has_trivial_assign和has_trivial_constructor?如果一个对象有一个不平凡的赋值运算符或一个不平凡的构造函数,它不是一个POD。那么在什么情况下知道一个对象有一个微不足道的赋值操作符,而且是一个不平凡的构造函数呢?

换句话说,为什么不定义一个单一的类型特质模板is_pod<T>,并用它来完成?

回答

6

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

一个类型可能有一个非平凡的构造函数,但可能有一个微不足道的赋值运算符。

E.g.

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

    int y; 
}; 

X可以是'memcopy'-ied,但不是平凡的构造。