来自 T* 的 std::unique_ptr<T> 的构造函数显式背后的原因是什么?
What's the reasoning behind std::unique_ptr<T>'s constructor from T* being explicit?
由于 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
不能按值传递,所以这应该不是问题,不是吗?
unique_ptr
获得传递指针的所有权。取得所有权应该是明确的——你不希望某些指向 'magically' 的指针被某些 class 拥有(和删除)(这是不推荐使用的 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
请注意,return
语句中不需要 std::move
(特殊语言例外 - 作为 return
参数的局部变量可以被视为 'moved')。
此外 - 在 C++14 中,您可以使用 std::make_unique
来减少尴尬:
return std::make_unique<some_data>(some_data_argument1, arg2);
(它也可以很容易地添加到 C++11 - 阅读 here)
采用唯一 ptr 的参数不应默默地取得指针的所有权。
因此 ctor 是显式的。
到 return,尝试 make_unique<foo>(?)
而不是 {new foo(?)}
。
由于 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
不能按值传递,所以这应该不是问题,不是吗?
unique_ptr
获得传递指针的所有权。取得所有权应该是明确的——你不希望某些指向 'magically' 的指针被某些 class 拥有(和删除)(这是不推荐使用的 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
请注意,return
语句中不需要 std::move
(特殊语言例外 - 作为 return
参数的局部变量可以被视为 'moved')。
此外 - 在 C++14 中,您可以使用 std::make_unique
来减少尴尬:
return std::make_unique<some_data>(some_data_argument1, arg2);
(它也可以很容易地添加到 C++11 - 阅读 here)
采用唯一 ptr 的参数不应默默地取得指针的所有权。
因此 ctor 是显式的。
到 return,尝试 make_unique<foo>(?)
而不是 {new foo(?)}
。