代码之家  ›  专栏  ›  技术社区  ›  Xzhsh

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

  •  3
  • Xzhsh  · 技术社区  · 16 年前

    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的?

    提前谢谢。

    2 回复  |  直到 16 年前
        1
  •  16
  •   Pavel Minaev    16 年前

    我的心理能力告诉我你在Visual C++上编译这就是为什么它能工作。在标准C++中,不能传递rValm(这是返回值的值)。 makeRandomData

    但是,如果您更改的签名,该问题仍然有效 mean 采取行动 const vector<int>& results . 对于表达式语句,完整表达式就是整个语句。

    该标准没有规定函数参数抑制RVO的任何方式,但是,当然,RVO是编译器的一项任务,它要求编译器进行特定的优化,而不考虑明显的副作用,而不是 要求 去做吧。RVO何时(如果)发生完全取决于您使用的特定编译器。也就是说,似乎没有任何理由让它受到任何影响。

        2
  •  4
  •   AnT stands with Russia    16 年前

    在C++中,不能将临时对象传递给一个非常量引用的函数。上面发布的示例不会编译。如果你的编译器编译它,它是你的编译器的一个怪癖(扩展)。如果您的编译器在编译它时甚至没有发出诊断消息,那么您的编译器就坏了。

    临时对象 makeRandomData() 呼叫),只能传递给 mean 通过常量限定引用。即你的

    int mean(const vector<int> & data) 
    

    在这种情况下,引用将直接绑定到 makeRandomData() ,或编译器可能选择创建的临时对象的另一个副本。(在这种情况下,后者不太可能,但在理论上可能发生。)