考虑以下情况
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
和template对常量的评估是相同的。
- 'bax不是有效的模板参数'或
static_assert
不应引发非恒定条件错误。
我说错了吗?
2条答案
按热度按时间uemypmqf1#
当一个函数被内联时,指向该函数的指针并不存在,所以我们不能将其与nullptr进行比较。
函数最终是否内联取决于编译器。
inline
关键字不能保证这一点。fnvucqvd2#
只是另一个
GCC
错误,更新到新版本,或迁移到LLVM
(clang
)。详见出库单:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52036