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)的最后一步被销毁,该表达式(词法上)包含创建它们的点.
你的行为是有保障的.
有两个条件,如果满足,将延长临时的寿命.第一个是它是一个对象的初始化器.第二个是参考绑定临时.
AnT*_*AnT 12
管理临时对象生命周期的规则与范围概念无关.范围是名称的属性,临时对象没有名称.换句话说,临时对象没有范围.
大多数情况下,临时对象的生命周期在创建该对象的完整表达式的末尾结束,这是您在实验中观察到的.这是一般规则,有一些例外.主要的一点是,如果你立即附加对临时对象的引用,对象的生命周期将被扩展以匹配引用的生命周期
const Foo &rfoo = Foo("one");
Run Code Online (Sandbox Code Playgroud)
上述临时生活只要rfoo生命.