我在Bjarne Stroustrup的书中找到了这段代码:
此代码的问题是变量pearson <- function(d,i=c(1:dim(xy)[1]){
d2 <- d[i,]
return(cor(d2$ts_a,d2$ts_b))
}
bootcorr <- boot(data=xy,statistic=pearson,R=999)
bootcorr
#Making a result table for output using 95% BCa CI
resultTable <- summary(bootcorr)
resultTable <- cbind(resultTable , CI95pc = NA)
for (i in 1:dim(resultTable )[1]) {
##Extracting CI from boot.ci output
a <- boot.ci(bootcorr,index = i, conf=.95, type = 'bca')$bca[4:5]
##Adding the CI to your output table
resultTable $CI95pc[i] <- paste(round(a[1],3),"-",round(a[2],3),sep=" ")
rm(a)
}
print(resultTable)
不会保持为2,它会增加到3.您可以在此处查看:https://wandbox.org/permlink/p5JC1nOA4pIpsgXb
我们不必使用i
来增加此变量。这是书中的错误还是自C ++ 11以来发生过一些变化?
答案 0 :(得分:10)
示例不正确,bind
确实复制了其参数,除非您将其包含在std::reference_wrapper
中,正如文本正确所说,但这不是示例所示的内容。在示例中,参数i
将传递给bind
返回的仿函数,而不是bind
本身。如果该示例改为以下,则i
的值将保持2
。
auto inc = bind(incr, i); // a copy of i is made
inc(); // i stays 2; inc(i) incremented a local copy of i
在本书所示的示例中,参数i
将被转发到incr
,这将导致对传递给函数的原始i
的左值引用,以及原始i
将递增。
相关标准报价,来自 23.14.11.3 [func.bind.bind] / 10
绑定参数
v1
,v2
,...,vN
及其对应类型V1
,V2
,...,{{1}的值依赖于调用VN
的{{1}}类型和调用包装器TDi
的cv-qualifiers cv ,如下所示:
...
- 如果bind
的值g
不为零,则参数为j
,其类型is_placeholder_v<TDi>
为std::forward<Uj>(uj)
;