gpt4 book ai didi

C++17类模板推导

转载 作者:行者123 更新时间:2023-11-27 22:45:45 25 4
gpt4 key购买 nike

我正在尝试在 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* .所以如果你想从构造函数中推导出类模板参数,你首先需要知道哪个删除器提供了指针类型,这会导致循环依赖,因此你无法知道什么是T。和 D应该来自构造函数参数。为了避免任何意外的误解,标准明确要求此构造函数不能用于模板参数推导(感谢 @T.C. 指出了准确的措辞!)。

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

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

关于C++17类模板推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com