C ++ 17类模板推导

时间:2017-04-07 01:18:09

标签: c++ c++17

我试图在C ++ 17中的类模板推导下。
我编写了一个示例类模板,可以在不指定模板类型的情况下构建。 std::unique_ptr无法在不指定类型的情况下构建。{。} 我需要帮助来理解为什么会这样。

使用clang 5.0编译的代码

// Please don't worry about memory leaks, etc. This is sample code anyways.
template<typename T, typename deleter = std::default_delete<T>>
struct Sample
{
T* x_;
deleter func_;

Sample(T* x = nullptr, deleter func = deleter{})
: x_(x)
, func_(func)
{
}
};

auto sample = Sample(new int(10));
std::cout << *(sample.x_) << '\n';

以下代码无法编译。

auto ptr = std::unique_ptr(new int(10)); 

1 个答案:

答案 0 :(得分:4)

类模板std::unique_ptr比您的玩具示例更复杂。它的主要所有权构造函数采用

形式
unique_ptr<T, D>::unique_ptr(pointer p)

其中pointerD::pointerremove_reference_t<D>::pointerT*。因此,如果您想从构造函数中推导出类模板参数,您首先需要知道哪个删除器提供了指针类型,这会导致循环依赖,因此您无法知道T和{{1}应该来自构造函数参数。为了避免任何意外误解,标准明确要求此构造函数不能用于模板参数推导(感谢@ T.C。指出精确的措辞!)。

一个简单的例子是,对于D类型的参数,您可以推导出U*unique_ptr<U>;两者都没有明显好转,错误的选择将是一场灾难。

简而言之,unique_ptr<U[]>的类模板参数不能从构造函数参数中推断出来,与std::unique_ptr的情况不同。