为什么在范围块结束之前,未命名的C++对象会被破坏?

mil*_*lus 17 c++ destructor scope

以下代码打印一,二,三.对于所有C++编译器来说,这是否合乎需要?


class Foo
{
      const char* m_name;
public:
      Foo(const char* name) : m_name(name) {}
      ~Foo() { printf("%s\n", m_name); }
};

void main()
{
      Foo foo("three");
      Foo("one");   // un-named object
      printf("two\n");
}
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 37

临时变量一直存在,直到创建它的完整表达式结束.您的结尾以分号结束.

这是在12.2/3:

临时对象作为评估全表达式(1.9)的最后一步被销毁,该表达式(词法上)包含创建它们的点.

你的行为是有保障的.

有两个条件,如果满足,将延长临时的寿命.第一个是它是一个对象的初始化器.第二个是参考绑定临时.

  • ......无论满足12.2/4的条件,这可以进一步延长临时寿命. (3认同)

AnT*_*AnT 12

管理临时对象生命周期的规则与范围概念无关.范围是名称的属性,临时对象没有名称.换句话说,临时对象没有范围.

大多数情况下,临时对象的生命周期在创建该对象的完整表达式的末尾结束,这是您在实验中观察到的.这是一般规则,有一些例外.主要的一点是,如果你立即附加对临时对象的引用,对象的生命周期将被扩展以匹配引用的生命周期

const Foo &rfoo = Foo("one");
Run Code Online (Sandbox Code Playgroud)

上述临时生活只要rfoo生命.


Jon*_*onM 6

像这样的临时对象的范围只是一行.考虑一下,你不能再在行结束后引用它,那么为什么对象会留在身边呢?

如果不是这种情况,编译器将无法在函数调用中优化临时对象.