7

我查看了 GCC STL (4.6.1) 并看到它std::copy()使用优化版本,以防内置函数__is_trivial()评估为true.

由于std::copy()std::reverse_copy()模板对于复制数组中的元素非常有用,我想使用它们。但是,我有一些类型(它们是模板实例化的结果),它们是包含一些琐碎值、没有指针并且没有复制构造函数或赋值运算符的结构。

G++ 是否足够聪明,可以发现我的类型实际上是微不足道的?C++98 中是否有任何方法可以确保 STL 实现知道我的类型是微不足道的?

is_trivial<>我猜想在 C++11 中,使用类型特征会变得很方便。这是正确的吗?

谢谢!

编辑:很抱歉这么晚了,但这里有一个非常简单的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;
} 
4

2 回答 2

5

trivial关于什么意思一直存在一些争论。

例如,据我所知,您的示例并不是简单可构造的(std::is_trivially_default_constructible我认为会返回 false)。

在您的情况下,我认为您需要std::is_trivially_copyable更细粒度的新 trait 。所以...升级你的编译器?

于 2012-01-18T16:58:13.973 回答
4

__is_trivial为所有类型提供正确的值。

您不能依赖任何特定的 STL 实现来使用它,尽管如果编译器供应商提供了它,那么它可能确实包含各种特定于编译器的幕后改进。

C++11std::is_trivial只是对这个特性进行了标准化,实现没有理由不使用它。

于 2012-01-18T16:33:47.280 回答