Dan*_*iel 30 c++ algorithm constexpr c++14
为什么没有任何std::algorithm方法constexpr?如果我正确理解新的C++ 14规则,那么很多方法都可以constexpr.例如,为什么不能std::find有constexpr?
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论坛上的相关讨论
Die*_*ühl 11
函数不能基于constexpr-ness 重载.因此,定义为constexpr需要以可能的形式实现的任何功能constexpr.此要求对所有实现施加约束.
与C++ 11相比,C++ 14规范在约束方面有所放松.然而,当规范最终确定时,没有人确信constexpr在强制要求算法时可以实现所有可以在没有约束的情况下实现的优化constexpr.在不知道constexpr强制constexpr实现不妨碍非功能性的情况下,算法将不被定义为constexpr.非constexpr使用算法仍假定为主要用途的算法.
可能值得拥有一组特殊的算法constexpr.我不知道有一个相应的提议.如果需求保证标准化,我也没有看到太多,但我的看法可能与其他人不同.
当前(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_element的std::initializer_list.
从C++ 1z(17?)开始,std::xxx_element算法将成为constexpr通用迭代器和比较器输入的算法,以统一使用std::initializer_list.此外,还有针对C++ 1z的lambda函数的建议constexpr.
随着lambdas的升级,仍然存在一些核心语言限制,以防止整个<algorithm>标头变为constexpr.(请注意,这些不是硬核技术障碍,大多数都可以通过允许编译器来评估它们来解决).
std::get_temporary_buffer(std::inplace_merge,std::stable_sort和std::stable_partition)动态分配内存,这在constexpr上下文中是不允许的.memset(std::fill和std::fill_n),这将阻止库作者在constexpr上下文中使用这些算法.goto(例如std::nth_element,std::stable_sort),为此,C++1z提案被否决.constexpr是,界面发生了变化,承诺所有未来的实施都必须实现这一承诺.因此,不允许将实现添加constexpr为实施质量功能(与此相反noexcept).特别是第四个问题阻碍了constexpr标准库(算法,容器和其他实用程序)可以推送多少实验.相反,必须为每次扩展编写和批准单独的提案constexpr.