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)); 
克雷克SB

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

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++ 17之前模拟类模板参数推导?

来自分类Dev

C ++ 17:从模板中的Callable推导签名

来自分类Dev

C ++ 17模板参数推导失败

来自分类Dev

自C ++ 17以来,可否为构造函数提供模板参数推导,从而允许显式指定某些类模板参数?

来自分类Dev

模板参数推导C ++

来自分类Dev

模板参数推导C ++

来自分类Dev

问题在GCC / C ++ 17与模板的模板类

来自分类Dev

在C ++-17中,此构造函数是否可以提供模板推导指南?

来自分类Dev

C ++模板函数类型推导

来自分类Dev

C ++模板函数类型推导

来自分类Dev

自动推导其类型时,将C ++ 11枚举类作为模板传递

来自分类Dev

非类型模板参数中的C ++类类型:推导指南失败

来自分类Dev

C ++-模板参数推导/替换失败

来自分类Dev

在C ++中推导模板类型的类型

来自分类Dev

C ++中的模板化参数推导

来自分类Dev

C ++可变参数模板推导失败

来自分类Dev

使用Lambdas进行C ++模板参数推导

来自分类Dev

模板推导:移植到 C++11

来自分类Dev

C ++ 17调用不带尖括号的模板类的静态方法

来自分类Dev

在模板函数中推导模板函数(使用C ++概念)

来自分类Dev

C ++自动推导派生类

来自分类Dev

模板相关参数的类模板参数推导

来自分类Dev

C ++继承模板类

来自分类Dev

C ++模板类继承

来自分类Dev

C ++:扩展模板类

来自分类Dev

类声明的C ++模板

来自分类Dev

C ++模板类澄清

来自分类Dev

C ++继承模板类

来自分类Dev

从模板类派生C ++