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

标签 c++ templates arguments

为什么 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,由于构造函数可以重载,仍然会出现问题。

关于C++ 当模板参数推导失败时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5528096/

相关文章:

arguments - fortran意图(in,out,inout)之间的明显区别是什么?

C++ ...当所有参数都有默认值时

c++ - 为什么这个 Qt 信号永远不会发出?

c++ - 将 char* 转换为 boost::array 以供套接字使用

c++ - 模板类型名实例化错误

c++ - 如何确定以该类型为参数的仿函数的返回类型?

c++ - OpenCV 的 Canny 检测在更复杂的图像上速度较慢

c++ - 获取调用堆栈的大小

c++ - 为什么我不能声明一个同时具有模板容器和模板包含值的类型?

python - 我应该对 Python 中的错误/非法参数组合提出哪个异常?