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

jef*_*yer 5 c++ templates arguments

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

a = unique_ptr(new A());
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*lis 10

std::unique_ptr是一个模板,而不是一个函数模板.参数推导仅适用于函数模板,而不适用于模板.

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

template <typename T>
std::unique_ptr<T> make_unique_ptr(T* ptr) 
{
    return std::unique_ptr<T>(ptr);
}
Run Code Online (Sandbox Code Playgroud)

对于std::unique_ptr,不过,我会避免这样做:一个std::unique_ptr对象应该直接采取动态分配对象的所有权,所以不应该有需要这一点.您的代码应该写成:

std::unique_ptr<A> a(new A());
Run Code Online (Sandbox Code Playgroud)

或者,如果a已经存在,reset()可以使用以下呼叫:

a.reset(new A());
Run Code Online (Sandbox Code Playgroud)

至于为什么类型推导不能用于实例化类模板,请考虑以下示例:

template <typename T>
struct X
{
    template <typename U> X(U) { }
};
Run Code Online (Sandbox Code Playgroud)

没有办法T可以从构造函数的调用中推断出来.即使在存在具有类型参数的构造函数的"更简单"情况下,T仍然可能存在问题,因为构造函数可能会被重载.