【发布时间】:2020-04-25 01:56:09
【问题描述】:
基本思路是这样的:我有一些constexpr函数,我想用throw来表示错误和惰性编译以避免在正常流程中出现这个错误:
template <size_t N>
auto constexpr find_elt(const std::array<int, N>& a, int k) {
for (size_t i = 0; i < N; ++i)
if (k == a[i])
return i;
throw "not found";
}
然后:
constexpr int result = find_elt(arr, 4);
通常,如果数组中存在 4,我会在编译时取回它的索引。
如果不是,我将通过throw 指示在编译时查找错误,编译器会产生一个漂亮的错误。
但我注意到奇怪的行为:
Under the latest clang, everything works
Under the latest gcc, everything fails
这个想法合法吗?此代码是否适合我想要实现的目标?哪个编译器在这里告诉我真相?
如果不是,正确的做法是什么?
感谢任何指向 C++ 标准的链接。我通读了与 constexpr 相关的章节,但我有疑问。
【问题讨论】:
-
@cigien question by your link 是关于非常简单的案例,4 年前已在 gcc 6 中修复
-
我猜这里的想法是一样的,这是一个 gcc 错误。
-
不清楚。在引用的情况下,抛出是在明确的条件下,一切都是显而易见的。在这种情况下,gcc 可能是正确的,我将重写代码以将 throw 置于某些明确的条件下。
-
我不确定,但我认为这是一回事。如果你传递一个导致函数抛出的参数,clang 也会失败。