在 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
也许这可以节省一些时间。
为了弄清楚为什么会出现某个编译错误,我想到了以下最小示例:
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
也许这可以节省一些时间。