为什么 std::accumulate 在 C++20 中没有成为 constexpr?

Why has std::accumulate not been made constexpr in C++20?

在 C++20 中,已经制定了许多(大多数?)C++ 标准库算法 constexpr。然而 - std::accumulate has not.

seems like 它可能是:

template<class InputIt, class T>
constexpr T accumulate(InputIt first, InputIt last, T init)
{
    for (; first != last; ++first) {
        init = std::move(init) + *first;
    }
    return init;
}

所以 - 有什么原因没有 constexpr 吗?

注意:这个问题的动机是my answer to this question关于编译时积累。

TL;DR;

有一个提案正在处理中。在过程完成之前我们不会知道结果,但它不会生成 C++20。

更长的答案

确实有提案:constexpr for algorithms,引用相关部分:

This proposal is to add constexpr to the following function templates in , excepting the function templates that accept an ExecutionPolicy.

  • accumulate

...

cplusplus/papers issue 432可以看出,该论文已移至语言演化工作组:

R0, needs to be looked at / forwarded by LEWG. Removing the LWG tag.

里程碑移至 2019-11:

modified the milestones: 2019-07, 2019-11

这将是即将到来的 Belfast meeting,因此它不会生成 C++20。

P1645R1 was actually adopted in the Belfast meeting for inclusion in C++20 in response to NB comment US 320.

因此,以下所有算法在 C++20 中都将是 constexpr(除了采用 ExecutionPolicy 的重载):

  • 积累
  • 减少
  • inner_product
  • transform_reduce
  • partial_sum
  • exclusive_scan
  • inclusive_scan
  • 变换_exclusive_scan
  • 变换_inclusive_scan
  • adjacent_difference
  • iota