【发布时间】:2021-07-23 00:04:02
【问题描述】:
我有以下功能:
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(使用宏会不那么可怕),但我更喜欢在函数中工作的解决方案。有没有办法在这种情况下触发编译失败?
【问题讨论】:
-
一般这类函数如果找不到数据不会失败,它们会返回一个越界标记(通常是-1)。搜索您的收藏中不存在的东西是完全有效的。
-
为什么不能抛出异常或者使用
assert? -
您仍然可以通过
constexpr发送throw。我对consteval不够熟悉,无法确定,但我相信您也应该能够从他们那里获得throw。 -
您能否澄清一下您是否认为在
consteval中不允许投掷,或者您是否有不使用throw的外部要求? -
@chris:可以。其中一个答案提到了这一点。