Подтвердить что ты не робот

Static_assert на встроенной функции дает ошибку

Рассмотрим следующий случай

typedef void (*foo)();
template<foo f>
struct bar {
     static_assert(f!=nullptr,"f == null!");
};

void baz() {}
inline void bax() {  }

bar<baz> ok;
bar<bax> bad; // error: non-constant condition for static assertion

Оба baz и bax принимаются как аргументы шаблона. Это указывает на то, что оба они принимают в качестве констант. Однако при static_assert они кажутся разными (по крайней мере, в gcc 4.9) - bax больше не является константой.

Мое предположение заключалось в том, что static_assert и шаблон одинаково оценивают постоянство. Например. либо ошибка должна быть

  • 'bax не является допустимым аргументом шаблона' или
  • static_assert не должен вызывать непостоянную ошибку условия.

Я не прав?

4b9b3361

Ответ 1

Когда функция встроена, указатель на функцию не существует. Поэтому мы не можем сравнивать его с nullptr.

Независимо от того, включена ли функция в конце или нет, зависит от компилятора. inline ключевое слово не гарантирует этого.