【发布时间】:2011-07-28 12:54:57
【问题描述】:
为什么 C++ 不能确定我打算使用这种语法创建 unique_ptr<A>? (a 之前已声明为 unique_ptr<A>)
a = unique_ptr(new A());
必须包含<A> 似乎非常多余。这适用于我使用的大多数函数模板,为什么不使用 unique_ptr?
编辑:C++ 现在支持 make_unique,没有冗余。
【问题讨论】:
为什么 C++ 不能确定我打算使用这种语法创建 unique_ptr<A>? (a 之前已声明为 unique_ptr<A>)
a = unique_ptr(new A());
必须包含<A> 似乎非常多余。这适用于我使用的大多数函数模板,为什么不使用 unique_ptr?
编辑:C++ 现在支持 make_unique,没有冗余。
【问题讨论】:
std::unique_ptr 是 class 模板,而不是 function 模板。参数推导只发生在 function 模板,而不是 class 模板。
一个常用的技巧是写一个函数模板,创建一个实例化类模板类型的对象,例如:
template <typename T>
std::unique_ptr<T> make_unique_ptr(T* ptr)
{
return std::unique_ptr<T>(ptr);
}
不过,对于std::unique_ptr,我会避免这样做:std::unique_ptr 对象应该直接获取动态分配对象的所有权,因此不需要这样做。你的代码应该写成:
std::unique_ptr<A> a(new A());
或者,如果a 已经存在,则可以调用reset():
a.reset(new A());
至于为什么类型推导对实例化类模板不起作用,请考虑以下示例:
template <typename T>
struct X
{
template <typename U> X(U) { }
};
T 不可能从构造函数的调用中推导出来。即使在构造函数的参数类型为T 的“更简单”的情况下,由于构造函数可能被重载,因此仍然存在问题。
【讨论】:
std::unique_ptr。