C ++当模板参数推断失败时

时间:2011-04-03 07:00:33

标签: c++ templates arguments

为什么C ++不能确定我打算用这种语法创建unique_ptr<A>? (a先前已被声明为unique_ptr<A>

a = unique_ptr(new A());

必须包含<A>似乎非常多余。这适用于我使用的大多数函数模板,为什么不使用unique_ptr?

编辑: C ++现在支持make_unique,没有冗余。

1 个答案:

答案 0 :(得分:10)

std::unique_ptr模板,而不是功能模板。参数推断仅适用于功能模板,而不适用于模板。

一个常用的技巧是编写一个函数模板,用于创建实例化类模板类型的对象,例如:

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,也可能会出现问题,因为构造函数可能会被重载。