gpt4 book ai didi

c++ - 如何使 consteval 函数失败?

转载 作者:行者123 更新时间:2023-12-03 18:12:42 26 4
gpt4 key购买 nike

我有以下功能:

template <size_t TSize>
consteval size_t indexOf(SomeEnum someEnum,
const std::array<SomeEnum, TSize> &arr) {
for (size_t i = 0; i < TSize; ++i) {
if (arr[i] == someEnum) {
return i;
}
}
// How to fail here?
return SOME_DEFAULT_WRONG_VALUE;
}
该函数应该失败而不是返回默认值,但我不能抛出异常或调用 assert .我可以添加一个 static_assert对函数的每次调用(使用宏它会不那么可怕),但我更喜欢在函数中工作的解决方案。在这种情况下有没有办法触发编译失败?

最佳答案

Is there a way to trigger a compilation failure in such a scenario?


如果目标是触发编译失败,那么最简单的方法就是抛出异常。异常是什么无关紧要,因为它实际上不会被抛出,抛出异常的行为将触发编译错误,因为在常量评估时间不允许抛出:
template <size_t TSize>
consteval size_t indexOf(SomeEnum someEnum,
const std::array<SomeEnum, TSize> &arr) {
for (size_t i = 0; i < TSize; ++i) {
if (arr[i] == someEnum) {
return i;
}
}

throw "failed to find someEnum";
}
如果你想更明确,你可以有一个非 constexpr没有定义的函数:
void trigger_consteval_failure(char const*);

template <size_t TSize>
consteval size_t indexOf(SomeEnum someEnum,
const std::array<SomeEnum, TSize> &arr) {
for (size_t i = 0; i < TSize; ++i) {
if (arr[i] == someEnum) {
return i;
}
}

trigger_consteval_failure("failed to find someEnum");
}
在这两种情况下,如果您要查找数组中的值,则调用此函数是一个有效的常量表达式。但是如果没有找到索引,那么我们最终会做一些现在允许在常量表达式中的事情,无论如何,这是一个硬编译错误,如所愿。
如果我们能在这种情况下产生更好的堆栈跟踪,那就太好了,但我认为实际上没有办法做到这一点。

关于c++ - 如何使 consteval 函数失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67320438/

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