当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗?

时间:2018-07-24 05:50:42

标签: c++ c++20

在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容器的情况下有用。有人可以澄清我是否缺少什么,我的理解是否正确?。

1 个答案:

答案 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