我使用了“ Is there a way to test a C++ class是否具有默认构造函数(编译器提供的类型特征除外)? ”中的代码。
我稍微修改了它以适用于我所有的测试用例:
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
. 但是,我的问题是关于为什么这两种实现有任何差异以及为什么一种有效而另一种无效。