C++17 class 模板推导
C++17 class template deduction
我正在尝试在 C++17 中的 class 模板推导下。
我写了一个示例 class 模板,可以在不指定模板类型的情况下构建它。 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));
class 模板 std::unique_ptr
比您的玩具示例更复杂。它的主要所有权构造函数采用
形式
unique_ptr<T, D>::unique_ptr(pointer p)
其中 pointer
是 D::pointer
或 remove_reference_t<D>::pointer
或 T*
。因此,如果你想从构造函数中推导出 class 模板参数,你首先需要知道哪个删除器提供了指针类型,这会导致循环依赖,因此你无法知道 T
和D
应该来自构造函数参数。为了避免任何意外的误解,标准明确要求此构造函数不能用于模板参数推导(感谢@T.C。指出准确的措辞!)。
一个简单的例子是,对于类型为 U*
的参数,您可以推导出 unique_ptr<U>
或 unique_ptr<U[]>
;显然两者都不是更好,错误的选择将是一场灾难。
长话短说,std::unique_ptr
的 class 模板参数不能从构造函数参数中推导出来,这与 Sample
.
的情况不同。
我正在尝试在 C++17 中的 class 模板推导下。
我写了一个示例 class 模板,可以在不指定模板类型的情况下构建它。 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));
class 模板 std::unique_ptr
比您的玩具示例更复杂。它的主要所有权构造函数采用
unique_ptr<T, D>::unique_ptr(pointer p)
其中 pointer
是 D::pointer
或 remove_reference_t<D>::pointer
或 T*
。因此,如果你想从构造函数中推导出 class 模板参数,你首先需要知道哪个删除器提供了指针类型,这会导致循环依赖,因此你无法知道 T
和D
应该来自构造函数参数。为了避免任何意外的误解,标准明确要求此构造函数不能用于模板参数推导(感谢@T.C。指出准确的措辞!)。
一个简单的例子是,对于类型为 U*
的参数,您可以推导出 unique_ptr<U>
或 unique_ptr<U[]>
;显然两者都不是更好,错误的选择将是一场灾难。
长话短说,std::unique_ptr
的 class 模板参数不能从构造函数参数中推导出来,这与 Sample
.