如何在常量评估表达式中获得编译时错误?
How to get a compile time error in constant evaluated expression?
我有一个 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);
}
我曾经用 C 写过一个库,我称之为 curb,它会做这样的事情。
我有一个 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);
}
我曾经用 C 写过一个库,我称之为 curb,它会做这样的事情。