C++ 临时共享\u ptr对象的生存期

C++ 临时共享\u ptr对象的生存期,c++,C++,一方面,一般来说,临时对象在其所属的完整表达式结束时被销毁 引用标准N4140第12.2节的草案: 临时对象将被销毁,这是计算完整表达式的最后一步,该表达式(在词汇上)包含创建临时对象的点 P>另一方面,考虑案例1 #include <iostream> #include <memory> using std::cout; using std::endl; using std::shared_ptr; void process(shared_ptr<int&g

一方面,一般来说,临时对象在其所属的完整表达式结束时被销毁

引用标准N4140第12.2节的草案:

临时对象将被销毁,这是计算完整表达式的最后一步,该表达式(在词汇上)包含创建临时对象的点

P>另一方面,考虑案例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;
}
#包括
#包括
使用std::cout;
使用std::endl;
使用std::shared_ptr;
作废流程(共享)
{

std::cout表达式
shared\u ptr(shared\u ptr(new int))
只创建一个临时,它相当于
shared\u ptr(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;
}
shared_ptr f(shared_ptr&&x){return x;}
int main()
{
//N1:

cout表达式
shared\u ptr(shared\u ptr(new int))
只创建一个临时,它相当于
shared\u ptr(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;
}
shared_ptr f(shared_ptr&&x){return x;}
int main()
{
//N1:

cout Google search:copy elision。这不是说,参数可以绑定到&&,不需要副本。Google search:copy elision。这不是说,参数可以绑定到&&,不需要副本。再嵌套一个级别以获得更大的教育效果!非常感谢演示!现在已经清楚了。最后一个打印语句可能有n过多的
那里:)再嵌套一个级别以获得更好的教育效果!非常感谢演示!现在它变得清晰了。最后一个打印语句可能有过多的
那里:)
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;
}