代码之家  ›  专栏  ›  技术社区  ›  shoosh

C++:临时参数的生命周期?

  •  59
  • shoosh  · 技术社区  · 14 年前

    创建的新实例时 MyClass 作为这样一个函数的参数:

    class MyClass
    {
      MyClass(int a);
    };    
    
    myFunction(MyClass(42));
    

    该标准是否对销毁程序的时间做出了任何保证?

    myFunction() ?

    4 回复  |  直到 4 年前
        1
  •  117
  •   sbi    8 年前

    临时对象在其所属的完整表达式结束时被销毁。

    完整表达式是不是其他表达式的子表达式的表达式。通常这意味着它结束于 ; ) 对于 if , while switch 表示语句的结尾。在您的示例中,它是函数调用的结束。

    const 参考文献。这样做会将它们的生存期延长到引用的生存期:

    MyClass getMyClass();
    
    {
      const MyClass& r = getMyClass(); // full expression ends here
      ...
    } // object returned by getMyClass() is destroyed here
    

    如果您不打算更改返回的对象,那么这是一个保存拷贝构造函数调用的好方法(与 MyClass obj = getMyClass();

        2
  •  27
  •   Steve Jessop    10 年前

    每个人都正确地引用了12.2/3或类似内容,回答了您的问题:

    临时对象将作为 完全表达(词汇上) 包含它们所在的位置

    我觉得有趣的是 在下一页 在我打印的标准中,12.2/4说:

    临时工一下子就被摧毁了 与终点不同

    它们都不适用于您的示例,它们都与在初始值设定项中使用临时变量有关。但它确实表明,在处理像C++标准这样的棘手动物时,你必须保持头脑清醒。

        3
  •  10
  •   anon anon    14 年前

    本标准确实提供了保证——第12.2/5节:

    临时绑定到引用 函数调用中的参数(5.2.2) 持续到完成

        4
  •  3
  •   Mike Mueller    14 年前

    在第12.2节“临时对象”第3条中,ANSI/ISO C标准规定:“。。。临时对象作为计算完整表达式的最后一步被销毁,该表达式(在词汇上)包含创建它们的点。”

    这与经济全球化的概念密切相关 Sequence Points