Я ожидаю, что следующий отчет о недоставке будет неправильно сформирован, но, похоже, нет :-(
#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 разных значения в зависимости от точек реализации.
Ссылки, которые, кажется, делают программу плохо сформированной, но не так, как я понимаю:
интерпретация такой конструкции в гипотетическом экземпляре отличается от интерпретации соответствующей конструкции в любом фактическом создании экземпляра шаблона.
Специализация для шаблона функции, шаблона функции-члена или функции-члена или статического члена данных шаблона класса может иметь несколько точек создания экземпляров в единице перевода, и в дополнение к точкам создания экземпляров, описанным выше, для любых таких специализации, которая имеет точку создания в пределах единицы перевода, конец единицы трансляции также считается точкой создания экземпляра. Специализация для шаблона класса имеет не более одной точки создания экземпляра в единице перевода. Специализация для любого шаблона может иметь точки реализации в нескольких единицах перевода. Если две разные точки реализации придают специализации шаблона разные значения в соответствии с правилом одного определения, программа плохо сформирована, и диагностика не требуется.
Я не прав ? или, к сожалению, эта программа верна.