Мой вопрос в том, действителен ли следующий код:
template<int i> class Class
{
static_assert(sizeof(i) == 0, "Class instantiated with i != 1");
};
template<> class Class<1> {};
Этот фрагмент компилируется с g++
. Но clang++
попал в ловушку static_assert
:
error: static_assert failed "Class instantiated with non-int type"
Шаблон, который использует тип вместо int
как
template<typename T> class Class
{
static_assert(sizeof(T) == 0, "Class instantiated with non-int type");
};
template<> class Class<int> {};
принимается обоими компиляторами. Точно такой же шаблон применяется к шаблонам функций.
Я нашел open-std.org::Независимый static_assert-declarations, но это, похоже, не применимо, потому что мой static_assert
зависит от параметра шаблона.
Вы можете проверить описанное поведение на godbolt.org.
EDIT: Как отмечает Йохан Лундберг в комментарии, мой вопрос неверен. Действительно, sizeof(i)
не зависит от параметра шаблона. Также совершенно прав Р.Саху: Гораздо разумнее было бы утверждать i != 1
. Для этого снова оба компилятора принимают код.
Однако все еще верхний пример компилируется с g++
. Как open-std.org::Независимый static_assert -declarations относится к этому случаю (я еще раз извиняюсь за неправильный вопрос в этом отношении): действительно ли g++
неправильно компилирует код без ошибок?
static_assert(i != 1, "Class instantiated with i != 1");
? - person R Sahu   schedule 08.04.2017typename T
неверен? Потому что здесьstatic_assert
зависит от параметра шаблона (даже если он всегда равен false). Почему это должно быть неправильно? - person marlam   schedule 08.04.2017template<typename T> class Class;
, и предложить определение только для допустимых специализаций? Компилятор наверняка пожалуется, если не будет доступной допустимой специализации. Или есть еще один момент, который следует учитывать? - person marlam   schedule 08.04.2017std::function<T>
. Вы также можете определитьtemplate<int N> struct always_false : public std::false_type {};
и выполнитьstatic_assert(always_false<i>::value, "My error");
- person aschepler   schedule 08.04.2017