智能指针制造商

A smart pointer maker

我正在研究完美转发的经典示例:智能指针生成器。

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);

但是编译不通过,说"no matching function for call to 'std::shared_ptr::shared_ptr(int)'"

如果您正确地编写了完美的转发函数,使其转发了它的参数,那么

shared_ptr<int> p = smartPointerMaker(42);

相当于:

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

编译失败不足为奇。

你应该使用 std::make_shared() 如果它在你的编译器中可用(它应该):

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

您的手动实施不起作用,因为您没有将输入参数传递给 Tnew 编辑实例以供 shared_ptr 保存。您试图将参数直接传递给 shared_ptr 构造函数,这不是 shared_ptr 的工作方式,也是代码编译失败的原因。

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

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);