我希望以下内容是不正确的 NDR,但似乎不是:-(
#include <type_traits>
template <typename T, typename Enabler = void>
struct is_complete : std::false_type {};
template <typename T>
struct is_complete<T, std::void_t<decltype(sizeof(T) != 0)>> : std::true_type {};
class X;
static_assert(!is_complete<X>::type{}); // incomplete type
class X {};
static_assert(!is_complete<X>::type{}); // complete, but already instantiated
注意:假设sizeof(T) != 0
对完整性特征有效(因为没有类型可以具有sizeof(T) == 0
,使用其他常量将强制为特征找到更好的名称:-))
它是代码的变体,如果它已经被隐式实例化,那么它是隐式实例化的吗?,其中程序已被声明为格式错误的程序,不需要诊断 (NDR),因为该方法 is_complete_helper<X>::test<X>
具有 2 个不同的含义,具体取决于实例化点。
似乎使程序格式错误的参考文献,但据我了解并非如此:
在假设的实例化中对这种构造的解释不同于在模板的任何实际实例化中对相应构造的解释。
函数模板、成员函数模板或类模板的成员函数或静态数据成员的特化可以在翻译单元内具有多个实例化点,并且除了上述实例化点之外,对于任何此类在翻译单元内有一个实例化点的特化,翻译单元的末端也被认为是一个实例化点。类模板的特化在翻译单元内最多有一个实例化点。任何模板的特化都可能在多个翻译单元中具有实例化点。如果根据单一定义规则,两个不同的实例化点赋予模板特化不同的含义,则程序是非良构的,不需要诊断。
我错了 ?或者不幸的是,这个程序是正确的。