gpt4 book ai didi

c++ - 如果函数被称为 constexpr,则有条件地 static_assert

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:12 24 4
gpt4 key购买 nike

我知道有人提议使用 constexpr() 运算符,但这还没有在 gcc/clang 中实现。我也知道有一个使用机器代码编辑等技巧的实现:

http://saadahmad.ca/detecting-evaluation-context-inside-constexpr-functions/

我想知道是否有一个有点受限的解决方案:

struct F {
constexpr F(int v) {
if constexpr(constexpr()) {
static_assert(v > 0);
}
else {
assert(v > 0);
}
}
};

// ...

constexpr F f{0}; // should trigger a compile-time error

我知道不能这样使用static_assert,但这只是为了澄清问题。

最佳答案

在您的特定情况下,您可以只保留断言 - 它会在条件错误时阻止编译,因为断言处理程序是非 constexpr:

#include <cassert>

struct F {
constexpr F(int v) {
assert(v >0);
}
};

// ...

constexpr F f1{0}; // doesn't compile in debug
constexpr F f2{1}; // compiles

然而,这不会触发发布时的编译时错误。可以通过创建自己的断言并添加对某些非 constepxr 函数的调用来解决:

#include <cassert>

// some non-constexpr function
void AssertConditionFailed()
{
}

#define ASSERT_WIH_COMPILE_TIME_CHECK(...) \
assert(__VA_ARGS__); \
if (!(__VA_ARGS__)) \
{ \
AssertConditionFailed(); \
}\

struct F {
constexpr F(int v) {
ASSERT_WIH_COMPILE_TIME_CHECK(v >0);
}
};

// ...

constexpr F f1{0}; // doesn't compile
constexpr F f2{1}; // compiles

关于c++ - 如果函数被称为 constexpr,则有条件地 static_assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55647490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com