c++ - 如果将匿名对象传递给采用引用的函数,在 C++ 中会发生什么情况?

标签 c++ reference

IE 如果你有下面这段代码会发生什么?

int mean(const vector<int> & data) {
  int res = 0;
  for(size_t i = 0; i< data.size(); i++) {
    res += data[i];
  }
  return res/data.size();
}

vector<int> makeRandomData() {
  vector<int> stuff;
  int numInts = rand()%100;
  for(int i = 0; i< numInts; i++) {
    stuff.push_back(rand()%100);
  }
}

void someRandomFunction() {
  int results = mean(makeRandomData());
}

我认为 C++ 只会在平均生命周期内保留新创建的对象,然后因为它超出范围而销毁它,我的想法是否正确?

此外,这如何与 RVO 一起工作/干扰?

提前致谢。

已编辑:添加了常量,忘了把它放进去。

最佳答案

我的灵能告诉我,您是在 Visual C++ 上编译它,这就是它甚至可以工作的原因。在标准 C++ 中,您不能将右值(即 makeRandomData 的返回值)传递给非常量引用,因此这个问题没有实际意义。

但是,如果您更改mean的签名,问题仍然有效。采取const vector<int>& .在这种情况下,这一切都归结为临时的生命周期——它被定义为持续到它出现的“完整表达式”结束。在您的特定情况下,完整表达式是 results 的整个初始化程序.如果是表达式语句,完整的表达式就是整个语句。

标准没有指定函数参数可以抑制 RVO 的任何方式,但是,当然,RVO 是编译器强制执行特定优化而不考虑可见的副作用,而不是要求 去做。何时(以及是否)发生 RVO 完全取决于您使用的特定编译器。也就是说,似乎没有任何理由说明它应该以任何方式受到影响。

关于c++ - 如果将匿名对象传递给采用引用的函数,在 C++ 中会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622601/

相关文章:

android - 编辑 android init.rc 以重新启动第三方守护进程

c++ - 变量卡在 If 中

C++ - 如何检查类型对齐要求

java - 无法确定一段代码的错误在哪里

reference - Latex:在同一位置引用两个同名作者的引用文献时如何避免省略作者姓名

c++ - 选择重载引用接受函数

c++ - boost::python 导出自定义异常并继承自 Python 的 Exception

c++ - 编译时单例初始化

perl - 确定Perl代码引用的子例程名称

java - 非静态字段在 Java 中更改之前是否是静态的?