【问题标题】:error: call to implicitly-deleted copy constructor of unique_ptr with auto错误:使用 auto 调用 unique_ptr 的隐式删除的复制构造函数
【发布时间】:2018-06-17 23:52:41
【问题描述】:

我有两个模板声明如下:

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)得到以下错误:

错误:调用隐式删除的复制构造函数 'std::__1::unique_ptr >, std::__1::default_delete > > >' if(auto rPN = pN->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的类型推导出为右值表达式pN-&gt;getParent()的类型,它返回一个类型unique_ptr&lt;node&lt;T&gt;&gt;&amp;.

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

有人能指点一下吗?

【问题讨论】:

  • 如果我正确读取the type deduction rules for templatesauto 使用),则在确定推导类型A 时,原始类型P 的引用被剥离(参见项目#3在“开始扣除之前,对P和A进行以下调整:”之后,说明“如果P是引用类型,则使用P所引用的类型进行扣除。”)。基本上,auto 表示值类型,除非您明确将其设为 auto&amp;&amp;auto&amp;。使用const auto&amp;(可能还有auto&amp;&amp;;我的C++ 生锈了)应该可以工作。
  • 带有大量... 的代码 sn-ps 并不能很好地描述一个需要 StackOverflow 解决的好问题。请用完整、可验证和可重现的代码来说明您的示例。另外,在问题中,您指的是已删除的复制构造函数,这是不可能发生的事情,您可以删除一个或多个实例,但永远不要删除复制构造函数.... .

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


【解决方案1】:
  1. auto 关键字应该将左值表达式rPN 的类型推导出为右值表达式pN-&gt;getParent() 的类型,它返回一个类型unique_ptr&lt;node&lt;T&gt;&gt;&amp;

不,类型将是unique_ptr&lt;node&lt;T&gt;&gt;

Auto type deduction 应用与模板参数推导相同的规则;表达式的引用部分(即pN-&gt;getParent())被忽略,之后const 部分也被忽略。所以结果类型是unique_ptr&lt;node&lt;T&gt;&gt;

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

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

当然可以。问题是rPN 不是参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2016-09-11
    相关资源
    最近更新 更多