std :: list <std :: unique_ptr <T >>:传递它

rub*_*nvb 8 c++ unique-ptr c++11

说我有一个std::listclass T"S:

std::list<T> l;
Run Code Online (Sandbox Code Playgroud)

将它传递给函数时,我会使用引用:

someFunction( std::list<T> &l )
Run Code Online (Sandbox Code Playgroud)

什么是绕过的(元素)的最佳方式std::listunique_ptrS'

std::list< std::unique_ptr<T> >  l;
Run Code Online (Sandbox Code Playgroud)

像这样:

someFunction( std::unique_ptr<T> ptr )
Run Code Online (Sandbox Code Playgroud)

或这个:

someFunction( T* ptr )
Run Code Online (Sandbox Code Playgroud)

或这个:

someFunction( T &ref )
Run Code Online (Sandbox Code Playgroud)

什么我将如何调用它使用std::listback()例如功能?这些是恕我直言所有"类型"相当,但我敢肯定我在这里遗漏了一些东西.

谢谢

Mic*_*yan 8

为了最好的情况:

  1. someFunction(const T&);
  2. someFunction(T&);
  3. someFunction(const std :: unique_ptr <T>&);
  4. someFunction(标准::的unique_ptr <T>&);

第一个是最好的,因为它不会修改它的对象,无论你如何分配它都可以使用它(例如,你可以毫无问题地切换到shared_ptr).

无论你使用什么智能指针,第二个也会工作; 但是,它假设您可以修改对象,并且只要您可以创建const,就应该.

数字3和4都允许指向的对象发生变异; 但是,#3不允许修改智能指针,而数字4则允许.两者都有缺点,它们强制使用unique_ptr,而上面的两个都可以工作,无论智能指针类.

按值传递unique_ptr,就像在其他一些示例中一样,不是一个选项; unique_ptr应该是唯一的.如果要复制它,请考虑使用shared_ptr.

对于前两个,如果你在back()的结果上调用它,它看起来像:

someFunction(*(lst.back()));  // dereference lst.back() before passing it in.
Run Code Online (Sandbox Code Playgroud)

对于后两者,如果你在back()的resut上调用它,它看起来像:

someFunction(lst.back()); // pass the smart pointer, not the object to
                          // which the smart pointer currently points.
Run Code Online (Sandbox Code Playgroud)