考虑这个例子:检查类型被定义
#include <iostream>
#include <type_traits>
template <class, class = void>
struct is_defined : std::false_type
{ };
template <class T>
struct is_defined<T,
std::enable_if_t<std::is_object<T>::value &&
!std::is_pointer<T>::value
>
> : std::true_type
{
private:
static const T test; //try to create incomplete type member
};
struct defined { };
struct forward_declared;
int main()
{
std::cout << std::boolalpha
<< is_defined<defined>::value << std::endl
<< is_defined<forward_declared>::value << std::endl;
}
输出是true
两者。我想如果我尝试使不完整类型的成员struct
成员,那么这个模板专门化将从超载设置中丢弃。但事实并非如此。删除static const
会导致不完整的编译时错误。这种方法有什么问题,如果可能的话,怎么能实现呢?
'is_object'并不意味着'is_complete'。 –
@ n.m。这只是为了不允许检查参考。我可以使用'std :: is_reference'来代替,但这并没有太大的不同。 – xinaiz
好的我看到你正在试图声明一个静态的东西去除不完整的类型。无论如何,你需要使用ODR来使用静态的东西。 –