c++ - 如何在常量评估表达式中获得编译时错误?
问题描述
我有一个Assert
用来评估断言的函数:
如果前置条件在运行时失败,该函数将输出错误消息并终止程序。
如果前提条件在常量表达式中失败,则会导致编译时错误。
我希望当断言在常量评估表达式中失败时,这个函数也会生成一个编译时错误:
const int a = (Assert(false),0); //generate a runtime error
//=> I would like it generates a compile time error
我考虑过使用std::is_constant_evaluated
:compiler-explorer
#include <type_traits>
using namespace std;
void runtime_error();
constexpr void compile_time_error(){} //should generates a compile time error
constexpr void Assert(bool value){
if (value) return;
if (is_constant_evaluated())
compile_time_error();
else
runtime_error();
}
void func(){
const int a = (Assert(false),0);
}
我只使用 GCC,我寻找了一个会导致编译时错误的内置函数,这将是一个 constexpr 但没有找到。
是否有任何技巧可以在表达式中获得编译时错误,可以不断评估?
解决方案
您可以调用未定义的函数以导致编译时错误。或者,由于您无论如何都在使用 gcc,您可以从常量部分内部调用属性错误函数,以在本单元编译期间导致编译时错误。要使其工作,您必须在启用优化的情况下进行编译。
我看到std::is_constant_expression
它在 gcc 9.2 中不起作用,但我设法让它与__builtin_constant_p
.
#include <type_traits>
constexpr void Assert(bool value) {
if (__builtin_constant_p(value)) {
if (!value) {
extern __attribute__(( __error__ ( "error" ) ))
void compile_time_error(void);
compile_time_error();
}
} else {
if (!value) {
void runtime_error();
runtime_error();
}
}
}
void func(int b) {
const int a = (Assert(false), 0);
Assert(b == 0);
}
我曾经在 CI 中编写了一个名为cream的库,它会做这样的事情。
推荐阅读
- python - 如何使用 S3 存储中可用的 miniconda
- java - 由于防火墙,无法连接到组织内的 Maven 中央存储库,Maven 无法连接到内部 URL,并且在简单项目中失败
- c# - 使用局部视图递归 ASP.NET Core MVC 中的动态菜单
- c# - CsvHelper.CsvRead 不返回任何内容
- java - 如何从 Java 中的 ArrayList 创建一组 spark 数据框列/agg 参数
- java - RedirectAttributes 消息未显示在 html 上
- javascript - 如果我输入了错误的密码,那么它只会带我到下一条路线而不保存用户
- r - 自定义合并两列
- huawei-mobile-services - 如何在HarmonyOS手表上生成要与之通信的手机应用程序的签名证书指纹?
- c# - 自动选择第一条记录