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

ps。 VS2010编译器不会提示此代码,并且可以正常工作。

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

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

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

最佳答案


否,因为临时对象将在评估完整表达式的最后一步被破坏,该表达式包含创建对象的位置,这意味着它将持续到调用printPointer()结束为止。
从标准#12.2/4 Temporary objects[class.temporary]:

#12.2/6 Temporary objects[class.temporary]:

explanatory demo

07-24 13:31