为什么不是std :: algorithms constexpr,哪个可能?

Dan*_*iel 30 c++ algorithm constexpr c++14

为什么没有任何std::algorithm方法constexpr?如果我正确理解新的C++ 14规则,那么很多方法都可以constexpr.例如,为什么不能std::findconstexpr

static constexpr std::array<char, 4> DnaBases {'A', 'C', 'G', 'T'};

constexpr bool is_dna(char b)
{
    return std::find(std::cbegin(DnaBases), std::cend(DnaBases), b) != std::cend(DnaBases); // why not?
}
Run Code Online (Sandbox Code Playgroud)

还有哪些std::algorithm可能constexpr

For*_*veR 13

它可能是constexpr,但不能被评估为常量表达式,因为在这种情况下,例如对于编译时发现它需要: begin/end应该是constexpr,* operator迭代器应该是constexpr,operator ==应该是constexpr,operator !=对于迭代器应该是constexpr,operator ++因为迭代器应该是constexpr.但是,如果所有函数都是constexpr,那么可以实现许多算法constexpr.

您可以查看SPROUT库以实现constexpr容器/算法.

以及isocpp.org论坛上的相关讨论

  • 由于`std :: find`是一个函数*模板*,它可以标记以前的"条件constexpr".函数模板不必为每组模板参数生成有效constexpr函数的函数.但是,应该至少有一组参数,以便实例化是一个有效的constexpr函数(因此,例如,无法出现无条件的`throw`). (5认同)

Die*_*ühl 11

函数不能基于constexpr-ness 重载.因此,定义为constexpr需要以可能的形式实现的任何功能constexpr.此要求对所有实现施加约束.

与C++ 11相比,C++ 14规范在约束方面有所放松.然而,当规范最终确定时,没有人确信constexpr在强制要求算法时可以实现所有可以在没有约束的情况下实现的优化constexpr.在不知道constexpr强制constexpr实现不妨碍非功能性的情况下,算法将不被定义为constexpr.非constexpr使用算法仍假定为主要用途的算法.

可能值得拥有一组特殊的算法constexpr.我不知道有一个相应的提议.如果需求保证标准化,我也​​没有看到太多,但我的看法可能与其他人不同.

  • 例如,在给定适当的参数的情况下,@ daniel`std :: find`可能会调度到`memchr`(经过高度优化).MSVC的`find`就是这么做的. (2认同)

Tem*_*Rex 7

当前(C++ 14)标准库几乎没有相应的核心语言功能constexpr.

例如,2015年MSVC,其中只有C++ 11的语言支持constexpr,几乎可以完全实现的整个C++ 14标准库的使用constexpr.唯一的例外是std::min,std::max,std::minmax,std::min_element,std::max_element,std::minmax_elementstd::initializer_list.

从C++ 1z(17?)开始,std::xxx_element算法将成为constexpr通用迭代器和比较器输入的算法,以统一使用std::initializer_list.此外,还有针对C++ 1z的lambda函数的建议constexpr.

随着lambdas的升级,仍然存在一些核心语言限制,以防止整个<algorithm>标头变为constexpr.(请注意,这些不是硬核技术障碍,大多数都可以通过允许编译器来评估它们来解决).

  1. 一些算法可以通过调用std::get_temporary_buffer(std::inplace_merge,std::stable_sortstd::stable_partition)动态分配内存,这在constexpr上下文中是不允许的.
  2. 一些算法可以回退到低级C例程,例如memset(std::fillstd::fill_n),这将阻止库作者在constexpr上下文中使用这些算法.
  3. 一些算法实现可以受益于明智地使用goto(例如std::nth_element,std::stable_sort),为此,C++1z提案被否决.
  4. 最后但并非最不重要的constexpr是,界面发生了变化,承诺所有未来的实施都必须实现这一承诺.因此,不允许将实现添加constexpr为实施质量功能(与此相反noexcept).

特别是第四个问题阻碍了constexpr标准库(算法,容器和其他实用程序)可以推送多少实验.相反,必须为每次扩展编写和批准单独的提案constexpr.