6

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

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

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

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

4

1 回答 1

6

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

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

例如

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

    int y;
};

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

于 2009-10-05T11:26:27.943 回答