Я использовал код из Есть ли способ проверить, имеет ли класс С++ конструктор по умолчанию (кроме атрибутов типа компилятора)?".
Я немного изменил его, чтобы работать со всеми моими тестовыми примерами:
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) };
};
Почему он корректно работает с двумя версиями аргументов шаблона, но не с обычным (set #if 0
)?
Это ошибка компилятора? Я использую Visual Studio 2010.
Я использовал следующие тесты:
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 );
Я действительно в растерянности:
- Два теста не работают с другой версией:
int[100]
иNotDefaultConstructible
. Все тесты успешны с двумя версиями аргументов шаблона. - Visual Studio 2010 не поддерживает
std::is_default_constructible
. Однако, мой вопрос заключается в том, почему существует какая-либо разница в двух реализациях и почему одна работает, а другая - нет.