我正在研究完美转发的经典例子:智能指针制造商。
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;
答案 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);