![](/img/trans.png)
[英]Does standard C++11 guarantee that temporary object passed to a function will have been destroyed after the end of the function?
[英]Does standard C++11 guarantee that temporary object passed to a function will have been created before function call?
標准C ++ 11是否保證在開始執行函數之前已經創建了所有3個臨時對象?
即使臨時對象傳遞為:
#include <iostream>
using namespace std;
struct T {
T() { std::cout << "T created \n"; }
int val = 0;
~T() { std::cout << "T destroyed \n"; }
};
void function(T t_obj, T &&t, int &&val) {
std::cout << "func-start \n";
std::cout << t_obj.val << ", " << t.val << ", " << val << std::endl;
std::cout << "func-end \n";
}
int main() {
function(T(), T(), T().val);
return 0;
}
輸出:
T created
T created
T created
func-start
0, 0, 0
func-end
T destroyed
T destroyed
T destroyed
工作草案,編程語言標准C ++ 2016-07-12: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
§5.2.2函數調用
§5.2.2
1函數調用是一個后綴表達式,后跟括號,其中包含一個可能為空的逗號分隔的initializer-clause列表,這些子句構成函數的參數。
但是可以在func-start之后創建T中的任何一個嗎?
或者有沒有辦法將參數作為g / r / l / x / pr-value傳遞,以便在創建臨時對象之前啟動函數?
當調用函數(函數是否為內聯函數)時,與任何參數表達式相關聯的每個值計算和副作用,或者使用指定被調用函數的后綴表達式,都會在執行每個表達式或語句之前對其進行排序。叫功能。
從[expr.call] / 8我們有
[注意:后綴表達式和參數的評估都是相對於彼此的。 在輸入函數之前,對參數評估的所有副作用進行排序(參見1.9)。 - 尾注]
這意味着在輸入函數之前構造所有參數。
因此,這也保證了在函數退出后所有參數都被銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.