我研究了一下GCC的STL (4.6.1),发现std::copy()使用了一个优化的版本,以防内置的__is_trivial()计算结果为true。
由于std::copy()和std::reverse_copy()模板对于复制数组中的元素非常有用,因此我想使用它们。但是,我有一些类型(它们是模板实例化的结果),它们是包含一些微不足道的值的结构,没有指针,也没有复制构造函数或赋值操作符。
G++是否足够聪明,能够意识到我的类型实际上是微不足道的?在C++98中有没有办法确保STL实现知道我的类型是微不足道的?
我猜在C++11中,使用is_trivial<>类型特征会变得很方便。是这样的吗?
谢谢!
编辑:很抱歉来得太晚了,但是这里有一个非常简单的Type类的例子,这个类对于GCC和llvm来说不是微不足道的。有什么想法吗?
#include <iostream>
struct Spec;
template <typename TValue, typename TSpec>
class Type
{
public:
TValue value;
Type() : value(0) {}
};
int main()
{
std::cerr << "__is_trivial(...) == "
<< __is_trivial(Type<char, Spec>) << '\n';
return 0;
} 发布于 2012-01-19 00:58:14
关于trivial是什么意思,一直存在一些争论。
例如,据我所知,您的示例并不是可以构造的(我认为std::is_trivially_default_constructible会返回false )。
在您的例子中,我认为您需要新的特征std::is_trivially_copyable,它更细粒度。所以..。升级你的编译器?
发布于 2012-01-19 00:33:47
__is_trivial为所有类型提供了正确的值。
您不能依赖任何特定的STL实现来使用它,尽管如果编译器供应商提供了它,那么它可能包含各种特定于编译器的改进。
C++11的std::is_trivial只是对这个特性进行了标准化,没有理由一个实现不使用它。
https://stackoverflow.com/questions/8913747
复制相似问题