Kon*_*rov 5 c++ constexpr c++17
基本思想是这样的:我有一些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";
}
Run Code Online (Sandbox Code Playgroud)
进而:
constexpr int result = find_elt(arr, 4);
Run Code Online (Sandbox Code Playgroud)
通常,如果数组中存在 4,我将在编译时获取其索引。
如果没有,我就会陷入困境throw编译时的查找是错误的,并且编译器将产生一个漂亮的错误。
但我注意到奇怪的行为:
这个想法合法吗?这段代码对于我想要实现的目标是否正确?哪个编译器在这里告诉我真相?
如果不是,正确的方法是什么?
任何到 C++ 标准的链接都值得赞赏。我通读了 constexpr 相关的章节,但我有疑问。
小智 2
所以:
\nclang 编译器在这个意义上并不像 gcc 那样严格。因此,这场战斗,在我看来,gcc获胜。他更加致力于标准。\n另一方面,如果这是一个“懒惰”的过程,那么为什么不应该偷懒到底呢。好吧,你找到了最终的返回值 - 那么为什么还要进一步检查正确性呢?\n从这个意义上说,clang 得到了一点。
\n最后 - C++17 标准怎么说?
\n10.1.5 constexpr 说明符 [dcl.constexpr]
\n接下来我们看看“核心常量表达式”是什么:
\n8.20 常量表达式[expr.const]
\n2.22 - 一个 throw 表达式 (8.17)
\n并注意“不需要诊断”并且编译器不需要提供失败原因的详细解释。
\n| 归档时间: |
|
| 查看次数: |
749 次 |
| 最近记录: |