Ответ 1
Когда функция встроена, указатель на функцию не существует. Поэтому мы не можем сравнивать его с nullptr.
Независимо от того, включена ли функция в конце или нет, зависит от компилятора. inline
ключевое слово не гарантирует этого.
Рассмотрим следующий случай
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
и шаблон одинаково оценивают постоянство.
Например. либо ошибка должна быть
static_assert
не должен вызывать непостоянную ошибку условия.Я не прав?
Когда функция встроена, указатель на функцию не существует. Поэтому мы не можем сравнивать его с nullptr.
Независимо от того, включена ли функция в конце или нет, зависит от компилятора. inline
ключевое слово не гарантирует этого.