标准C++ 11是否保证在函数调用之前创建传递给函数的临时对象?

Ale*_*lex 3 c++ standards sequence-points lazy-sequences c++11

标准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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

T created 
T created 
T created 
func-start 
0, 0, 0
func-end 
T destroyed 
T destroyed 
T destroyed 
Run Code Online (Sandbox Code Playgroud)

工作草案,编程语言标准C++ 2016-07-12:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

§5.2.2函数调用

§5.2.2

1函数调用是一个后缀表达式,后跟括号,其中包含一个可能为空的逗号分隔的初始化子句列表,这些子句构成了函数的参数.

但是可以在func-start之后创建T中的任何一个吗?

或者有没有办法将参数作为g/r/l/x/pr-value传递,以便在创建临时对象之前启动函数?

在此输入图像描述

T.C*_*.C. 11

[intro.execution]/16:

当调用函数时(无论函数是否为内联函数),与任何参数表达式相关联的每个值计算和副作用,或者使用指定被调用函数的后缀表达式,都会在执行每个表达式或语句之前对其进行排序.叫功能.


Nat*_*ica 7

从[expr.call]/8我们有

[注意:后缀表达式和参数的评估都是相对于彼此的.在输入函数之前,对参数评估的所有副作用进行排序(参见1.9). - 尾注]

这意味着在输入函数之前构造所有参数.

因此,这也保证了在函数退出后所有参数都被销毁.