Utilicé el código de "Is there a way to test whether a C++ class has a default constructor (other than compiler-provided type traits)?".¿Por qué el uso de dos sizeofs funciona para verificar si una clase es construible por defecto, pero una no?
he modificado un poco para trabajar con todos mis casos de prueba:
template< class T >
class is_default_constructible {
typedef int yes;
typedef char no;
// the second version does not work
#if 1
template<int x, int y> class is_equal {};
template<int x> class is_equal<x,x> { typedef void type; };
template< class U >
static yes sfinae(typename is_equal< sizeof U(), sizeof U() >::type *);
#else
template<int x> class is_okay { typedef void type; };
template< class U >
static yes sfinae(typename is_okay< sizeof U() >::type *);
#endif
template< class U >
static no sfinae(...);
public:
enum { value = sizeof(sfinae<T>(0)) == sizeof(yes) };
};
¿Por qué funciona correctamente con la versión argumento de plantilla de la dos, pero no con la normal (establecido #if 0
)? ¿Es esto un error del compilador? Estoy usando Visual Studio 2010.
he utilizado las siguientes pruebas:
BOOST_STATIC_ASSERT(is_default_constructible<int>::value);
BOOST_STATIC_ASSERT(is_default_constructible<bool>::value);
BOOST_STATIC_ASSERT(is_default_constructible<std::string>::value);
BOOST_STATIC_ASSERT(!is_default_constructible<int[100]>::value);
BOOST_STATIC_ASSERT(is_default_constructible<const std::string>::value);
struct NotDefaultConstructible {
const int x;
NotDefaultConstructible(int a) : x(a) {}
};
BOOST_STATIC_ASSERT(!is_default_constructible<NotDefaultConstructible>::value);
struct DefaultConstructible {
const int x;
DefaultConstructible() : x(0) {}
};
BOOST_STATIC_ASSERT(is_default_constructible<DefaultConstructible>::value);
estoy realmente en una pérdida aquí:
- dos pruebas no están cumpliendo con la otra versión:
int[100]
yNotDefaultConstructible
. Todas las pruebas tienen éxito con la versión del argumento de dos plantillas. - Visual Studio 2010 no es compatible con
std::is_default_constructible
. Sin embargo, mi pregunta es acerca de por qué hay alguna diferencia en las dos implementaciones y por qué una funciona y la otra no.
Por qué no comprobar si ya lo tienes en la biblioteca estándar como [ 'std :: is_default_constructible'] (http://en.cppreference.com/w/cpp/types/is_default_constructible)? –
¿Qué no funciona? Funciona bien en g ++, a excepción de 'BOOST_STATIC_ASSERT (! Is_default_constructible :: value);' –
@ BЈовић Si una afirmación está fallando, y esa afirmación es correcta, no funciona bien, ¿no? – hvd