一方面,一般来说,临时对象在它所属的完整表达式的末尾被销毁。
引用标准N4140第12.2节的草案:
临时对象被作为评估全表达式的最后一步而被销毁,该表达式(词法上)包含创建它们的点。
另一方面,考虑案例1
#include <iostream>
#include <memory>
using std::cout;
using std::endl;
using std::shared_ptr;
void process(shared_ptr<int> p)
{
std::cout << p.use_count() << std::endl;
}
int main()
{
process(shared_ptr<int>(new int));
return 0;
}
甚至更简单,如案例2
using std::cout;
using std::endl;
using std::shared_ptr;
int main()
{
cout << shared_ptr<int>(shared_ptr<int>(new int)).use_count() << endl;
return 0;
}
在任何一种情况下,输出为1.不是2.
我对输出感到有些困惑,并感谢任何可能提供一些解释的人。
我对案例1的理解是shared_ptr<int>(new int)
是作为参数传递给process
的临时对象。根据标准,在process
返回之前不应该销毁它。如果是这种情况,那么从临时值初始化的参数p
在输出时应该具有2的use_count
,因为那时有{2}管理的对象{1}}。
我对案例2的理解遵循相同的逻辑。
似乎我的理解中肯定会有一些错误。有人可以指出他们吗?非常感谢。
注意:有几个已解决的问题与我有关,但阅读后我仍然感到困惑。您可以阅读this one作为参考。
答案 0 :(得分:3)
表达式shared_ptr<int>(shared_ptr<int>(new int))
只创建一个临时表达式,相当于shared_ptr<int>(new int)
。
您可以使用此代码查看您的期望:
shared_ptr<int> f(shared_ptr<int>&& x){return x;}
int main()
{
//N1:
cout << shared_ptr<int>(f(shared_ptr<int>(new int))).use_count() << endl;
return 0;
}
关注user1095108提案:
shared_ptr<int> f(shared_ptr<int>&& x){return x;}
int main()
{
//also prints 2, because equivalent to N1
cout << f(shared_ptr<int>(new int)).use_count() << endl;
//prints 3:
cout << shared_ptr<int>(f(f(shared_ptr<int>(new int)))).use_count() << endl;
//also prints 3:
cout << f(f(shared_ptr<int>(new int))).use_count() << endl;
return 0;
}