如何在constexpr函数中执行运行时断言?
How can I do a runtime assert in a constexpr function?
据我所知,constexpr函数可以在编译时执行,也可以在运行时执行,这取决于整个计算是否可以在编译时完成。
但是,您不能重载此函数以具有运行时和编译时对应的函数。
所以我的问题是,我如何放入一个运行时断言来确保运行时函数的执行与我的static_assert一起传递有效的参数?
Eric Niebler在c++ 11中的Assert和Constexpr中很好地讨论了这个问题,他指出在Constexpr函数中使用Assert在c++ 11中是不允许的,但在c++ 14中是允许的(作为Constexpr函数建议放宽约束的一部分),并提供了以下代码片段:
constexpr bool in_range(int val, int min, int max)
{
assert(min <= max); // OOPS, not constexpr
return min <= val && val <= max;
}
如果我们必须支持c++ 11,那么还有一些替代方案。最明显的一个是using throw,但正如他指出的那样,这会将本应不可恢复的错误变成可恢复的错误,因为您可以捕获异常。
他提出了一些建议:
使用noexcept指定符:
constexpr bool in_range(int val, int min, int max) noexcept { return (min <= max) ? min <= val && val <= max : throw std::logic_error("Assertion failed!"); }
如果一个异常离开函数std::terminate将被调用。
从异常类型的构造函数中调用std::quick_exit:
struct assert_failure { explicit assert_failure(const char *sz) { std::fprintf(stderr, "Assertion failure: %sn", sz); std::quick_exit(EXIT_FAILURE); } }; constexpr bool in_range(int val, int min, int max) { return (min <= max) ? min <= val && val <= max : throw assert_failure("min > max!"); }
传递一个lambda表达式,该表达式断言异常类型的构造函数:
constexpr bool in_range(int val, int min, int max) { return (min <= max) ? min <= val && val <= max : throw assert_failure( []{assert(!"input not in range");} ); }
可以抛出异常。如果在编译时从constexpr函数抛出异常,它基本上被视为静态断言失败。如果它发生在运行时,它将像往常一样只是一个异常。
在 周围传递constexpr对象还相关:当计算constexpr时抛出异常时会发生什么?
相关文章:
- 运行时执行策略不同
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- 在 Linux 上没有 /proc/self/exe 的 C/C++ 运行时可执行文件的大小?
- 为什么程序运行时我的第二个循环不执行?
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 自上而下的动态规划与递归朴素解决方案.检查运行时执行
- C++ 可执行文件在运行时找不到库,即使它在 /usr/lib 中(在 Linux 上)
- 尝试运行可执行文件时出现分段错误
- 根据运行时提供的类型执行模板函数
- 在 Qt 中将 x 可执行文件作为按钮事件运行时出错
- 运行可执行文件时找不到共享库,即使共享库存在于指定的路径中
- 使用 4 个和 8 个线程运行时执行的时间相等
- Bash 代码,仅在当前可执行文件完成运行时在循环中运行可执行文件
- cl 生成的可执行文件在第一次运行时运行速度非常慢
- 程序在运行时不执行任何操作
- 可执行文件在运行时出错
- 一个人如何从代表函数的字符串中执行运行时执行C 代码
- Dynamic_cast不需要执行运行时检查
- 如何在constexpr函数中执行运行时断言?