【发布时间】:2016-10-02 12:00:56
【问题描述】:
考虑这个例子:
#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,但这不会有太大的不同。 -
啊,好的,我看到您正试图声明一个静态的东西来清除不完整的类型。也没有工作,你需要 ODR 使用那个静态的东西。
标签: c++ templates typetraits incomplete-type