返回值优化和私有拷贝构造函数

jlu*_*rad 1 c++

我写了一个简单的链接列表,因为最近的一次访谈编程挑战向我展示了我的C++有多么生疏.在我的列表中,我声明了一个私有拷贝构造函数,因为我想明确避免制作任何副本(当然还有懒惰).当我想通过拥有我的一个列表的值返回一个对象时,我遇到了一些麻烦.

class Foo
{
   MyList<int> list;  // MyList has private copy constructor

   public:
      Foo() {};
};

class Bar
{
   public:
      Bar() {};

      Foo getFoo()
      {
         return Foo();
      }
};
Run Code Online (Sandbox Code Playgroud)

当我尝试按值返回Foo对象时,我收到编译器错误,指出MyList有一个私有拷贝构造函数.Return-Value-Optimization是否应该否定任何复制的需要?我需要写一个复制构造函数吗?在我开始寻找这个问题的解决方案之前,我从未听说过移动构造器,这是最好的解决方案吗?如果是这样,我将不得不阅读它们.如果没有,解决这个问题的首选方法是什么?

pmr*_*pmr 5

该标准明确指出构造函数仍然需要可访问,即使它被优化掉了.见12.8/32最近的草案.

在这种情况下,我更喜欢使物体可移动且不可复制.它使所有权非常清晰明确.

否则,您的用户可以随时使用shared_ptr.隐藏共享所有权充其量只是一个值得怀疑的想法(除非您能保证所有值都是不可变的).