c++ GCC 4.9在检查内联函数的指针时出错(使用static_assert)

zujrkrfu  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(143)

考虑以下情况

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

bazbax都被接受为模板参数。这表明两者都被接受为常量。然而,在static_assert中,它们似乎不同(至少在gcc 4.9中)-bax不再是常量。
我的假设是static_assert和template对常量的评估是相同的。

  • 'bax不是有效的模板参数'或
  • static_assert不应引发非恒定条件错误。

我说错了吗?

uemypmqf

uemypmqf1#

当一个函数被内联时,指向该函数的指针并不存在,所以我们不能将其与nullptr进行比较。
函数最终是否内联取决于编译器。inline关键字不能保证这一点。

fnvucqvd

fnvucqvd2#

只是另一个GCC错误,更新到新版本,或迁移到LLVMclang)。
详见出库单:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52036

相关问题