函数调用中的隐式析构函数执行

时间:2016-07-13 07:41:15

标签: c++ language-lawyer destructor temporary object-lifetime

我想知道标准对下面这段代码的说法。在调用string之前可以执行printPointer临时对象的析构函数吗?

P.S。 VS2010编译器不会抱怨此代码并且无法正常工作。

void printPointer(const string* pointer)
{
    cout << *pointer << endl;
}

const string* func(const string& s1)
{
    return &s1;
}

int main()
{
    printPointer(func("Hello, World!!!"));
}

2 个答案:

答案 0 :(得分:9)

  

在调用string之前,printPointer临时对象的析构函数是否可以执行?

不,因为临时对象将作为评估完整表达式的最后一步而被销毁,其中包含创建它们的点,这意味着它将持续到调用{{1}结束。

来自标准#12.2/4 Temporary objects [class.temporary]

  

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

#12.2/6 Temporary objects [class.temporary]

  

在函数调用([expr.call])中绑定到引用参数的临时对象会持续到包含该调用的完整表达式完成为止。

explanatory demo

答案 1 :(得分:-6)

您的字符串在程序结束前不会被销毁,因为s1是对它的引用(因此,它不会在func中销毁)。 Func中没有按值传递或按值返回。这段代码没问题。