Miré en el GCC STL (4.6.1) y vi que std::copy()
usa una versión optimizada en caso de que __is_trivial()
tenga true
.optimizaciones std :: copy/memcpy/memmove
Dado que las plantillas std::copy()
y std::reverse_copy()
son muy útiles para copiar elementos en matrices, me gustaría usarlas. Sin embargo, tengo algunos tipos (que son resultados de instancias de plantillas) que son estructuras que contienen algunos valores triviales, sin punteros y no tienen un constructor de copias ni un operador de asignación.
¿Es G ++ lo suficientemente inteligente como para descubrir que mi tipo de hecho es trivial? ¿Hay alguna forma en C++ 98 para asegurarme de que una implementación de STL sepa que mi tipo es trivial?
Supongo que en C++ 11, las cosas serán convenientes usando el rasgo de tipo is_trivial<>
. ¿Es esto correcto?
Gracias!
EDIT: Perdón por llegar tan tarde con esto, pero aquí hay un ejemplo de una clase Type
bastante simple que no es trivial para GCC y llvm. ¿Algunas ideas?
#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;
}
C++ 03 PODs forbit constructores por defecto también si recuerdo, que es probablemente lo que impide que sea trivial. –
@MooingDuck: Gracias, creo que esa es la explicación. Junto con la respuesta de Mathieu, esto responde mi pregunta. – Manuel