c – 为什么不能推导出unique_ptr的模板参数?
作者:互联网
当您从C 17获得类模板参数推导时,为什么不能推导出std :: unique_ptr的模板参数?例如,这给了我一个错误:
std::unique_ptr smp(new D);
这说“缺少类模板的参数列表”.
模板参数(至少是指针类型)不应该是可以推断的吗?
any declaration that specifies initialization of a variable and
variable template
解决方法:
我不会在@NathanOliver’s great answer中重复这个理由,我只是要提一下它的机理,我认为你也是如此.你是对的,如果unique_ptr的构造函数看起来只是…
explicit unique_ptr( T* ) noexcept;
…有可能推断出T.编译器生成的演绎指南可以正常工作.那就像一个问题,就像内森所说的那样.但构造函数是这样指定的……
explicit unique_ptr( pointer p ) noexcept;
…别名指针指定如下:
pointer
:std::remove_reference<Deleter>::type::pointer
if that
type exists, otherwiseT*
. Must satisfy NullablePointer.
该规范本质上意味着指针必须是__some_meta_function< T> :: type的别名. :: type左边的所有内容都是一个非推导的上下文,这可以防止从指针中扣除T.即使指针必须始终为T *,这就是如何使这些演绎指南失败.仅仅通过使其成为非推导的上下文将阻止从该构造函数生成的任何演绎指南的可行性.
标签:template-deduction,c,templates,c17 来源: https://codeday.me/bug/20190910/1801800.html