在 constexpr 函数中断言

assert in constexpr function

为了弄清楚为什么会出现某个编译错误,我想到了以下最小示例:

constexpr void Test(bool test)
{
    if (test)
        return;

    assert(false);
}

这对我尝试过的每个 clang 版本(3.7+)都没有问题,但对 gcc(测试 5-8)和

都失败了

error: call to non-‘constexpr’ function ‘void __assert_fail(const char*, const char*, unsigned int, const char*)’

根据我的理解,函数应该可以是 constexpr,因为有一组参数值可以在编译时计算函数。

是我理解有误,还是gcc编译不对?

这是 GCC bug 86678,几天前才修好。

如果你和我一样有这个问题,但你不能升级编译器,也不能更改代码。快速修复是通过向编译器添加 NDEBUG 标志让编译器删除断言:

  • gcc/clang: -DNDEBUG
  • msvc: /DNDEBUG

也许这可以节省一些时间。