T *中std :: unique_ptr <t>的构造函数背后的原因是什么?

时间:2015-08-28 11:27:44

标签: c++ c++11 unique-ptr explicit-constructor

由于std::unique_ptr提供了一种避免内存泄漏并确保异常安全的便捷方法,因此传递它们而不是原始指针是明智的。因此,人们可能希望(成员)函数具有类似

的签名
std::unique_ptr<some_type> foo(some data);

不幸的是,在实现这样的功能时,不能简单地

std::unique_ptr<some_type> foo(some data)
{
  return { new some_type(data) };                  // error
}

但必须

std::unique_ptr<some_type> foo(some data)
{
  return std::move( std::unique_ptr<some_type>( new some_type(data) ) );   // awkward
}

因为构造函数unique_ptr::unique_ptr(pointer)explicit。这个构造函数背后的原因是explicit

构造函数explicit的一个动机是防止意外的隐式类型转换。但是,由于unique_ptr不能通过值传递,这应该不是问题,是吗?

2 个答案:

答案 0 :(得分:19)

unique_ptr取得传递指针的所有权。取得所有权应该是明确的 - 你不需要一些指向魔法的指针。由某个类拥有(并删除)(这是被弃用的std::auto_ptr)的问题之一。

例如:

void fun(std::unique_ptr<X> a) { .... }
X x;
fun(&x); // BOOM, deleting object on stack, fortunately it does not compile
fun(std::unique_ptr<X>(&x)); // compiles, but it's explicit and error is clearly visible

请注意,std::move语句中不需要return(特殊语言例外 - return参数的局部变量可被视为&#39;移动&#39;)。

另外 - 在C ++ 14中,你可以使用std::make_unique来减少它的尴尬:

return std::make_unique<some_data>(some_data_argument1, arg2);

(它也可以轻松添加到C ++ 11中 - 阅读here

答案 1 :(得分:5)

采用独特ptr的参数不应该默默地拥有指针。

因此,ctor是明确的。

要返回,请尝试使用make_unique<foo>(?)代替{new foo(?)}