繁体   English   中英

C ++ 17类模板推论

[英]C++17 class template deduction

我正在尝试在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)); 

类模板std::unique_ptr比您的玩具示例更复杂。 其主要的所有权获取构造函数采用以下形式

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

其中pointerD::pointerremove_reference_t<D>::pointerT* 因此,如果您想从构造函数中推断出类模板参数,则首先需要知道哪个删除程序提供了指针类型,这导致了循环依赖,因此您无法从构造函数参数中知道TD应该是什么。 为避免任何意外的误解,标准明确要求此构造函数不得用于模板自变量推导(感谢@TC指出确切的用词!)。

一个简单的示例是,对于类型为U*的参数,您可以推导出unique_ptr<U>unique_ptr<U[]> 两者显然都不是更好,错误的选择将是一场灾难。

长话短说, std::unique_ptr的类模板参数不能从构造函数参数中推导,这与Sample情况不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM