[英]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.