Я заглянул в GCC STL (4.6.1) и увидел, что std::copy()
использует оптимизированную версию в случае, если встроенный __is_trivial()
имеет значение true
.
Поскольку шаблоны std::copy()
и std::reverse_copy()
очень полезны для копирования элементов в массивах, я хотел бы их использовать. Однако у меня есть некоторые типы (которые являются результатом инстанцирования шаблонов), которые являются структурами, содержащими некоторые тривиальные значения, без указателей и не имеют конструктора копирования или оператора присваивания.
Достаточно ли умна G++, чтобы понять, что мой тип на самом деле тривиальный? Есть ли в C++98 способ убедиться, что реализация STL знает, что мой тип тривиальный?
Я предполагаю, что в C++11 все станет удобнее с использованием признака типа is_trivial<>
. Так ли это?
Спасибо!
EDIT: Извините, что так поздно, но вот пример довольно простого класса 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;
}