C ++:被忽略的返回值破坏行为是否定义明确

时间:2015-05-19 15:22:10

标签: c++ language-lawyer

问题:是否会立即或在超出范围时销毁被忽略的返回值。?

以下代码返回我的编译器

输出:

  

谁成功,不需要它。

     

谁购买它,没用它。

     

谁使用它既不能看到也不能感受到它。

     

这是什么?

因此,忽略的值立即被破坏。但这个编译器是特定的还是标准行为?

struct foo
{
   ~foo()
   {
      std::cout << "Who makes it, has no need of it. \n"
                << "Who buys it, has no use for it. \n";
   }
}

foo createFoo()
{
   return foo();
}

int main(int argc, char* argv[])
{
     createFoo();
     std::cout << "Who uses it can neither see nor feel it.\n"
               << "What is it?"; 
}

3 个答案:

答案 0 :(得分:15)

如果完整表达式完成之外,如果通过绑定到右值或右值参考来延长其生命周期,则会立即销毁返回的临时值。

答案 1 :(得分:5)

在标准5.11中有

  

在某些情况下,表达式仅出现其副作用。这种表达式称为丢弃值   表达。计算表达式并丢弃其值。

因此,当表达式结束时,该值将被丢弃,如果它是类类型,则调用析构函数。

答案 2 :(得分:4)

PrimaryKey(s)

  

临时对象作为最后一步被销毁   在评估全表达(1.9)时(词法上)包含创建它们的点。即使该评估以抛出异常结束,也是如此。破坏的价值计算和副作用   临时对象仅与完整表达式相关联,而不与任何特定子表达式相关联。

异常是针对构造函数参数,以及绑定对临时的引用。 (§12.3/ 4F。)