template <size_t N>
class Foo
{
static_assert(N > 0, "WRONG");
//void Something() = 0; //my original implementation
};
int main() {
Foo<0> *p2 = nullptr; //no error
Foo<0> p; //gives an error
return 0;
}
Я тестировал обе линии отдельно. static_assert не вызывается, когда p2 инициализируется, но он вызывается и действительно не работает на p. Это предназначено? (Я пробовал это на gcc, clang и VC)static_assert не удается проверить шаблонный указатель объекта
Каковы обходные пути? Поскольку я использую абстрактные шаблонные классы, это было бы кошмаром, если бы утверждение выполнялось только при создании экземпляра объекта без указателя. Я могу использовать завод, но это не совсем правильное решение.
Это не совсем ответа на ваш вопрос, потому что это полезно иметь обходной путь, но * Если шаблон класса специализация не была явно инстанциирована явно специализирована, шаблон класса специализации неявно инстанцирована когда специализация ссылается в контексте , который требует полностью определенного типа объекта или когда полнота типа класса влияет на семантику программы. * – chris
У вас может быть указатель на неполный тип, поэтому инстанцирование не запускается когда вы просто создаете указатель на этот тип. –