簡體   English   中英

標准C ++ 11是否保證在函數調用之前創建傳遞給函數的臨時對象?

[英]Does standard C++11 guarantee that temporary object passed to a function will have been created before function call?

標准C ++ 11是否保證在開始執行函數之前已經創建了所有3個臨時對象?

即使臨時對象傳遞為:

  1. 賓語
  2. 右值引用
  3. 只傳遞臨時對象的成員

http://ideone.com/EV0hSP

#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傳遞,以便在創建臨時對象之前啟動函數?

在此輸入圖像描述

[intro.execution] / 16

當調用函數(函數是否為內聯函數)時,與任何參數表達式相關聯的每個值計算和副作用,或者使用指定被調用函數的后綴表達式,都會在執行每個表達式或語句之前對其進行排序。叫功能。

從[expr.call] / 8我們有

[注意:后綴表達式和參數的評估都是相對於彼此的。 在輸入函數之前,對參數評估的所有副作用進行排序(參見1.9)。 - 尾注]

這意味着在輸入函數之前構造所有參數。

因此,這也保證了在函數退出后所有參數都被銷毀。

暫無
暫無

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

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