如果您有以下代码,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/

10-12 17:19