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