簡體   English   中英

如果將匿名對象傳遞給需要引用的函數,C ++中會發生什么?

[英]What happens in C++ if you pass an anonymous object into a function that takes a 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?

提前致謝。

編輯:添加const,忘了把它放進去。

我的通靈能力告訴我你在Visual C ++上編譯它,這就是為什么它甚至可以工作。 在標准C ++中,您不能將rvalue(這是makeRandomData的返回值)傳遞給引用到非const,因此問題沒有實際意義。

但是,如果您更改mean的簽名以獲取const vector<int>& ,則該問題仍然有效。 在這種情況下,它都歸結為臨時的生命周期 - 它被定義為持續到它出現的“完整表達式”結束。 在您的特定情況下,完整表達式是results的整個初始化程序。 在表達式語句的情況下,完整表達式是整個語句。

該標准不指定任何方式,其中函數的參數可以抑制視網膜靜脈阻塞,但是,當然,RVO是其任務是編譯器做了特殊的優化,無論可見副作用,不這樣做的必要條件 何時(以及如果)RVO發生完全取決於您正在使用的特定編譯器。 也就是說,似乎沒有任何理由可以以任何方式影響它。

在C ++中,您無法將臨時對象傳遞給采用非常量引用的函數。 您在上面發布的示例將無法編譯。 如果您的編譯器編譯它,它是編譯器的一個怪癖(擴展)。 如果編譯器在沒有發出診斷消息的情況下編譯它,那么編譯器就會崩潰。

臨時對象(您的結果makeRandomData()調用),只能傳給mean通過一個常量限定參考。 即你的mean必須被宣布為

int mean(const vector<int> & data) 

在這種情況下,引用將直接綁定到makeRandomData()返回的臨時對象,或綁定到編譯器可能選擇創建的臨時對象的另一個副本。 (在這種情況下,后者不太可能,但理論上可能會發生。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM