У меня есть Assert
функция, которую я использую для оценки утверждения:
если предварительное условие не выполняется во время выполнения, эта функция выдаст сообщение об ошибке и завершит программу.
если предварительное условие не выполняется внутри константного выражения, это вызовет ошибку времени компиляции.
Я хотел бы, чтобы эта функция также генерировала ошибку времени компиляции, когда утверждение не выполняется в постоянном вычисляемом выражении:
const int a = (Assert(false),0); //generate a runtime error
//=> I would like it generates a compile time error
Я думал об использовании std::is_constant_evaluated
: компилятора-проводника
#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, но я ее не нашел.
Есть ли какой-нибудь трюк, чтобы получить ошибку времени компиляции в выражении, которое можно было бы вычислить константой?
static_assert
оценивается во время компиляции. Следовательно, проверяемое выражение должно бытьconstexpr
, а не простоconst
. И в этом проблема: компиляция вашей функцииcompile_time_error
function всегда будет терпеть неудачу. - person Rene   schedule 06.01.2020runtime_error()
. Это вызовет ошибку, если будет вычислено во время компиляции. - person cpplearner   schedule 06.01.2020