智能指针制造商

时间:2016-07-21 13:23:32

标签: c++ move-semantics

我正在研究完美转发的经典例子:智能指针制造商。

template<typename T>
   //Return a smart pointer on the given objet
   shared_ptr<T> smartPointerMaker(T&& arg)
   {
       return shared_ptr<T>(forward<T>(arg));
   }

//In the main...
shared_ptr<int> p = smartPointerMaker(42);

但它没有编译,说&#34;没有匹配函数来调用&#39; std :: shared_ptr :: shared_ptr(int)&#39;&#34;

2 个答案:

答案 0 :(得分:0)

如果你已经正确地编写了完美的转发函数,那么它就会转发它的参数,那么

shared_ptr<int> p = smartPointerMaker(42);

相当于:

shared_ptr<int> p = shared_ptr<int>(42);

这不会令人惊讶,因为这不会编译。

答案 1 :(得分:0)

如果编译器中有std::make_shared(),那么你应该使用{{3}}:

shared_ptr<int> p = make_shared<int>(42);

您的手动实现不起作用,因为您没有将输入参数传递给new T的{​​{1}}实例以保留shared_ptr。您试图直接将参数传递给shared_ptr构造函数,这不是shared_ptr的工作原理,以及代码无法编译的原因。

您需要将参数转发给T构造函数,并将new ed T实例指针传递给shared_ptr构造函数,例如:

template<class T, class U>
shared_ptr<T> smartPointerMaker(U&& arg)
{
    return shared_ptr<T>(new T(forward<U>(arg)));
}

或者:

template<class T, class... U>
shared_ptr<T> smartPointerMaker(U&&... args)
{
    return shared_ptr<T>(new T(forward<U>(args)...));
}

然后你可以这样做:

shared_ptr<int> p = smartPointerMaker<int>(42);