【问题标题】:Implicit destructor execution in function calling函数调用中的隐式析构函数执行
【发布时间】:2016-11-15 16:12:56
【问题描述】:

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

附言VS2010 编译器不会抱怨这段代码并且可以正常工作。

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

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

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

【问题讨论】:

  • 临时字符串仅在语句结束时被破坏。有人可能会挖掘参考(带有序列点的东西?)但您可以自己查看:ideone.com/N3Brll

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


【解决方案1】:

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

不,因为临时对象将作为评估包含创建它们的点的 full-expression 的最后一步被销毁,这意味着它将持续到printPointer() 的调用结束.

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

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

还有#12.2/6 Temporary objects [class.temporary]

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

explanatory demo

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 2015-02-09
    • 2021-11-20
    • 1970-01-01
    • 2021-01-28
    • 2016-12-28
    相关资源
    最近更新 更多