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