为什么不将std :: array的operator ==()标记为constexpr?

时间:2017-08-20 14:45:45

标签: c++11 comparison constexpr stdarray

想要在编译时比较std::arrayvery natural;它的operator==()显然constexpr'能够。然而 - 它isn't标记为constexpr。这是故意还是疏忽?而且 - 它是什么原因留下来的(显然也是在C ++ 17中)?

2 个答案:

答案 0 :(得分:7)

P0031解释了为什么它没有提出set.seed(5175) df <- data.frame(group=rep(c("A","B","C"),c(8,10,8)), size = c(rep(1000,5),rep(0,3),rep(2000,7),rep(0,3),rep(5000,5),rep(0,3)), out=c(rep(0,5),rnorm(3,5,1),rep(0,7),rnorm(3,5,1),rep(0,5),rnorm(3,5,1)), g1=rbinom(26,1,.5), g2=rbinom(26,1,.5), g3=rbinom(26,1,.5)) fun <- function(x){ i <- min(which(x$size > 0 & x$out == 0)) tmp1 <- x[i, ] i <- min(which(x$size == 0 & x$out != 0)) tmp2 <- x[i, ] tmp2[, 4:6] <- tmp1[, 4:6] tmp2 } res <- do.call(rbind, lapply(split(df, df$group), fun)) res 比较:

  

目前可以在帮助下实施比较和constexpr / swap   来自fill标头的算法。标记比较   constexpr将打破这种能力,并可能导致   性能下降。

例如,<algorithm>可以用==来实现,在适当的情况下,它可以调用高度优化但非明确的 - std::equal {{1 }}。为constexpr制作memcmp将排除此优化,而无需特殊的编译器帮助。

答案 1 :(得分:-1)

理由可能是这样的:如果包含的类型==也是constexpr,则数组的==只能是constexpr

由于容器无法强制执行,因此无法(通常)提供operator==() constexpr