C ++:将诸如unique_ptr :: get()之类的参数传递给函数

时间:2017-05-11 01:58:16

标签: c++ c++11 stl unique-ptr temporary

传递像getAName(getA().get())这样的函数参数是否安全? getA()返回一个对象unique_ptr<A>

我在VS 2010上使用下面的完整代码进行测试,它可以工作。但我想确定它是否是c ++标准,对其他c ++编译器是否安全?

#include "stdafx.h"
#include <memory>
#include <iostream>

using namespace std;

class A
{
public:
    A(){ cout<<"A()"<<endl;}
    ~A(){ cout<<"~A()"<<endl;}

    string name() { return "A"; }
};

std::unique_ptr<A> getA()
{
    return std::unique_ptr<A>(new A());;
}

void getAName(A* a)
{
    if(a)
    {
        cout << a->name().c_str() << endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    getAName(getA().get());
    return 0;
}

控制台中的输出是:

A()
A
~()

是否有必要为所有编译器安装以下代码?

unique_ptr<A> a = getA();
getAName(a.get());

1 个答案:

答案 0 :(得分:7)

很安全。 getA()返回temporary std::unique_ptr,它将在完整表达式后销毁,该表达式会占用getAName()的调用。因此,在getAName()的正文中,传递的指针仍然有效。

  

所有临时对象都被销毁,作为评估(词法上)包含创建它们的点的完整表达式的最后一步,...

请注意,如果传入的指针存储在某处(例如全局变量),然后稍后使用(即在调用getAName()之后),则指针指向的对象已被临时{{ 1}}并且指针变得悬空;那么对它的尊重将是UB。如果是这种情况,正如您所示,您可能需要一个命名变量。