【问题标题】:A smart pointer maker智能指针制造商
【发布时间】:2016-07-21 13:23:31
【问题描述】:

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

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

但它没有编译,说“没有匹配函数调用'std::shared_ptr::shared_ptr(int)'”

【问题讨论】:

  • 您应该使用T&amp;&amp; 进行转发,使用省略号... 进行可变参数模板。
  • 你从哪里得到这个例子的?它似乎没有任何“经典”。
  • 现在您错过了创作的new T 部分。现在你正试图通过给它一个 int 作为参数来创建一个 std::shared_ptr&lt;int&gt;,这显然是行不通的。

标签: c++ move-semantics


【解决方案1】:

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

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

您的手动实现不起作用,因为您没有将输入参数传递给Tnew ed 实例以保持shared_ptr。您正在尝试将参数直接传递给 shared_ptr 构造函数,这不是 shared_ptr 的工作方式,也是代码无法编译的原因。

您需要将参数转发给T构造函数,并将Tnewed实例指针传递给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);

【讨论】:

    【解决方案2】:

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

    shared_ptr<int> p = smartPointerMaker(42);
    

    相当于:

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

    这不编译应该不足为奇。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多