我想知道标准对下面这段代码的说法。在调用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!!!"));
}
答案 0 :(得分:9)
在调用
string
之前,printPointer
临时对象的析构函数是否可以执行?
不,因为临时对象将作为评估完整表达式的最后一步而被销毁,其中包含创建它们的点,这意味着它将持续到调用{{1}结束。
来自标准#12.2/4 Temporary objects [class.temporary]:
临时对象作为评估全表达式([intro.execution])的最后一步被销毁,该表达式(词法上)包含创建它们的点。
#12.2/6 Temporary objects [class.temporary]:
在函数调用([expr.call])中绑定到引用参数的临时对象会持续到包含该调用的完整表达式完成为止。
答案 1 :(得分:-6)
您的字符串在程序结束前不会被销毁,因为s1
是对它的引用(因此,它不会在func
中销毁)。 Func
中没有按值传递或按值返回。这段代码没问题。