在c ++ 20中提出,一些算法是constexpr。
例如:
template< class InputIt, class UnaryPredicate >
bool all_of( InputIt first, InputIt last, UnaryPredicate p );
(since C++11)
(until C++20)
template< class InputIt, class UnaryPredicate >
constexpr bool all_of( InputIt first, InputIt last, UnaryPredicate p );
(since C++20)
虽然我们知道迭代器通常不是constexpr。我认为这仅在constexpr容器的情况下有用。有人可以澄清我是否缺少什么,我的理解是否正确?。
答案 0 :(得分:7)
可以。让我们尝试另一种算法,据我所知p1 <- ggplot(dat,aes(x=Tvec,y=Floods,color=L1,linetype=factor(lines),shape=factor(points)))+
geom_ribbon(aes(ymin = CIlow90,ymax = CIhigh90,fill=L1),alpha = 0.4) +
geom_line(size=0.8)+geom_point()+
scale_x_continuous(trans = 'log10',limits=c(1,5)) +
#ylim(0.1,2*min(c(max(dfplot$Floods),max(dfpp1$Floods)))) +
scale_color_manual(labels = c("GEV-MLE", "GEV-PWM","Empirical Dist."),
values=cols,name = 'Distributions') +
scale_fill_manual(labels = c("GEV-MLE", "GEV-PWM","Empirical Dist."),
values=cols,name = 'Distributions')+
guides(shape = FALSE, linetype = FALSE,
colour = guide_legend(override.aes = list(shape = c(NA,NA,16),
linetype = c("solid","solid","blank"))))
p1
在C ++ 20中还没有constexpr
。但是定义一个std::iota
版本并不难(我只是从constexpr
复制了示例实现,并在其上拍了cppreference
):
constexpr
那么有用吗?是的。只要创建迭代器作为评估常量表达式的一部分,算法的评估就可以出现在常量表达式中。例如:
template<class ForwardIterator, class T>
constexpr void my_iota(ForwardIterator first, ForwardIterator last, T value)
{
while(first != last) {
*first++ = value;
++value;
}
}
上面创建了一个使用iota算法初始化的数组。如果将函数作为评估常量表达式的一部分而调用,则对象template<std::side_t N, typename T>
constexpr make_iota_array(T start = {}) {
std::array<T, N> ret{};
my_iota(ret.begin(), ret.end(), start);
return ret;
}
将作为评估的一部分创建,其迭代器也将创建。这些是有效的:
ret