错误:使用auto调用unique_ptr的隐式删除的复制构造函数

时间:2018-01-09 00:14:18

标签: c++ c++11 lambda unique-ptr auto

我有两个模板声明如下:

template < typename T >
      class node {
        public:
          ...
        const unique_ptr < node < T >> & getParent();
        ...
        private:
          ...
        unique_ptr < node < T >> & P; //for parent node
        ...
      };

    template < typename T1, typename T2 >
      class tree {
        public:
          tree(int, T2 & );
        ...
        void travPreord();
        ...
        private:
          ...
      };

在公共方法的定义中

template<typename T1, typename T2> tree<T1,T2>::travPreord() 

我有以下代码:

template < typename T1, typename T2 > 
    void tree < T1, T2 > ::travPreord() {

      //lambda definition

      function < void(unique_ptr < node < T1 >> & ) > prntNode = [ & ]
      (unique_ptr < node < T1 >> & pN) {

        ...

        if(auto rPN = pN - > getParent()) {

          ...

        }

      };

    }

对于上面if语句条件中的赋值,我从编译器得到以下错误(g ++ 4.2.1):

  

错误:调用隐式删除的复制构造函数   &#39; std :: __ 1 :: unique_ptr&gt;,   std :: __ 1 :: default_delete&gt; &GT; &GT;&#39;   if(auto rPN = pN-&gt; getParent()){

错误中突出显示的模板实例化的参数是从main():

提供的
int main() {

      vector < string > v;

      ...

      tree < string, vector < string >> T(v.size(), v);

      T.travPreord();

      ...

      return 0;

    }

我根据以下假设编写了if语句条件:

  1. 可以为引用分配unique_ptr。

  2. auto关键字应该将左值表达式rPN的类型推导为rvalue表达式pN->getParent()的类型,它返回类型unique_ptr<node<T>>&.

    < / LI>

    所以我不确定这个错误的来源。

    有人能说同样的话吗?

1 个答案:

答案 0 :(得分:3)

  
      
  1. auto关键字应该将左值表达式rPN的类型推导为rvalue表达式pN->getParent()的类型,它返回类型unique_ptr<node<T>>&
  2.   

不,类型为unique_ptr<node<T>>

Auto type deduction应用与模板参数推导相同的规则;表达式的参考部分(即pN->getParent())被忽略,之后const部分也被忽略。因此结果类型为unique_ptr<node<T>>

您需要明确说明它应该是一个引用,例如

auto& rPN = pN - > getParent() // rPN is of type const unique_ptr<node<T>>&
  
      
  1. 可以为引用分配unique_ptr。
  2.   

当然是的。问题是rPN不是参考。