“C ++编程语言[第4版] - Bjarne Stroustrup”中的绑定错误

时间:2017-08-15 17:48:04

标签: c++ c++11 bind

我在Bjarne Stroustrup的书中找到了这段代码: Page screenshot

此代码的问题是变量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以来发生过一些变化?

1 个答案:

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

  

绑定参数v1v2,...,vN及其对应类型V1V2,...,{{1}的值依赖于调用VN的{​​{1}}类型和调用包装器TDi的cv-qualifiers cv ,如下所示:
  ...
   - 如果bind的值g不为零,则参数为j,其类型is_­placeholder_­v<TDi>std​::​forward<Uj>(uj);