为什么 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
在 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