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

临时工的寿命

  •  37
  • Frunsi  · 技术社区  · 14 年前

    下面的代码工作正常,但为什么这是正确的代码?为什么foo()返回的临时指针的“c_str()”是有效的?我想,当bar()被输入时,这个临时文件已经被破坏了——但它看起来不像这样。所以,现在我假设foo()返回的临时文件将在调用bar()之后被销毁-这是正确的吗?为什么呢?

    std::string foo() {
      std::string out = something...;
      return out;
    }
    
    void bar( const char* ccp ) {
      // do something with the string..
    }
    
    bar( foo().c_str() );
    
    2 回复  |  直到 14 年前
        1
  •  45
  •   Chubsdad    14 年前

    $12.2/3-“临时对象是 作为最后一步被摧毁 计算完整表达式(1.9) (词汇上)包含了这一点。 它们的诞生地。这是真的 即使评估结果是 正在引发异常。“

    foo()返回的临时函数的生存期一直延长到创建它的完整表达式的末尾,即直到函数调用“bar”的末尾。

    编辑2:

    $1.9/12-“完整表达式是 不是子表达式的表达式 另一种表达方式。如果一种语言 构造的定义是生成 函数的隐式调用 语言结构被认为 作为一种表达 这一定义。”

        2
  •  64
  •   fredoverflow    14 年前

    一个临时对象在完全包含表达式的完整表达式中被破坏,其值创建了临时对象被完全评估。让我用ASCII艺术演示一下:

    ____________________   full-expression ranges from 'b' to last ')'
    bar( foo().c_str() );
         ^^^^^          ^
           |            |
         birth       funeral
    
    推荐文章