Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;17类模板扣减_C++_C++17 - Fatal编程技术网

C++ C++;17类模板扣减

C++ C++;17类模板扣减,c++,c++17,C++,C++17,我正在尝试在C++17中对类模板进行演绎。 我编写了一个示例类模板,它可以在不指定模板类型的情况下构造标准::唯一\u 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&l

我正在尝试在C++17中对类模板进行演绎。
我编写了一个示例类模板,它可以在不指定模板类型的情况下构造<代码>标准::唯一\u 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';

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

unique_ptr<T, D>::unique_ptr(pointer p)
unique_ptr::unique_ptr(指针p)
其中
pointer
D::pointer
remove\u reference\u t::pointer
t*
。因此,如果您想从构造函数推断类模板参数,首先需要知道哪个deleter提供指针类型,这会导致循环依赖,因此您无法知道构造函数参数应该是什么
T
D
。为了避免任何意外的误解,标准明确要求此构造函数在模板参数推断中不可用(感谢@T.C.指出了精确的措辞!)

一个简单的例子是,对于
U*
类型的参数,可以推断
unique\U ptr
unique\U ptr
;两者显然都不是更好的选择,错误的选择将是一场灾难


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

的情况不同,类模板
std::unique_ptr
比您的玩具示例更复杂。其主要所有权采用以下形式:

unique_ptr<T, D>::unique_ptr(pointer p)
unique_ptr::unique_ptr(指针p)
其中
pointer
D::pointer
remove\u reference\u t::pointer
t*
。因此,如果您想从构造函数推断类模板参数,首先需要知道哪个deleter提供指针类型,这会导致循环依赖,因此您无法知道构造函数参数应该是什么
T
D
。为了避免任何意外的误解,标准明确要求此构造函数在模板参数推断中不可用(感谢@T.C.指出了精确的措辞!)

一个简单的例子是,对于
U*
类型的参数,可以推断
unique\U ptr
unique\U ptr
;两者显然都不是更好的选择,错误的选择将是一场灾难



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

的情况不同,您是否愿意告诉我们错误消息是什么?元提示:当您试图说“请忽略所有细节”时,试着把所有的细节都准备好,看看问题是否还不清楚。很多事情都与细节有关。@KerrekSB如果它没有编译,那么编译器抱怨提供模板类型不是很明显吗?有什么需要关心或不关心的?这回答了你的问题吗?您是否愿意告诉我们错误消息是什么?Meta提示:当您想说“请忽略所有细节”时,请尝试将所有细节都准备好,看看问题是否仍然不清楚。很多事情都与细节有关。@KerrekSB如果它没有编译,那么编译器抱怨提供模板类型不是很明显吗?有什么需要关心或不关心的?这回答了你的问题吗?LWG添加了具体的措辞,表示从
指针
-获取系数的推导是格式错误的,这正是由于
T
vs
T[]
问题。好的,因此尝试在不提供模板类型的情况下进行编译,如果未能编译,则提供类型。就我而言,这就是该功能的全部内容understand@T.C.:但是有没有具体的措辞来实现这一点,或者它只是自然地遵循现有的类定义?我没有看到任何明确的指南。他们把它放在构造器的规范中,@t.C.:啊,是的,谢谢。我想说,这仍然可以被认为是“这个类模板更复杂”的一部分,但我会更新帖子,指出这一明确的规定。LWG添加了具体的措辞,说从
指针
-取因子的推导是错误的,正是由于
T
vs
T[]
problem.ok,请尝试在不提供模板类型的情况下编译,如果无法编译,请提供类型。就我而言,这就是该功能的全部内容understand@T.C.:但是有没有具体的措辞来实现这一点,或者它只是自然地遵循现有的类定义?我没有看到任何明确的指南。他们把它放在构造器的规范中,@t.C.:啊,是的,谢谢。我想说,这仍然可以被认为是“这个类模板更复杂”的一部分,但我会更新帖子,以引用这个明确的规定。