当您可以从C ++ 17获得类模板参数推导时,为什么不能推导std :: unique_ptr的模板参数呢?例如,这给我一个错误:
std::unique_ptr smp(new D);
说“缺少类模板的参数列表”。
不是应该推导出模板参数(至少是指针类型)吗?
任何声明变量初始化的声明,以及 可变模板
答案 0 :(得分:17)
让我们看看new int
和new int[10]
。两者都返回int*
。无法判断您应该使用unique_ptr<int>
还是unique_ptr<int[]>
。这项权利足以提供任何类型的推论指南。
答案 1 :(得分:5)
我不会在@NathanOliver's great answer中重复其原理,我只想提一下它的 how ,机制,这也是我想你也希望得到的。没错,如果unique_ptr
的构造函数看起来就像...
explicit unique_ptr( T* ) noexcept;
...可以推断出T
。编译器生成的推导指南可以正常工作。就像Nathan所说明的那样,这将是一个问题。但是构造函数是这样指定的...
explicit unique_ptr( pointer p ) noexcept;
...,其中别名pointer
的指定如下:
pointer
:std::remove_reference<Deleter>::type::pointer
类型存在,否则为T*
。必须满足 NullablePointer 。
该规范实质上意味着pointer
必须是__some_meta_function<T>::type
的别名。 ::type
左侧的所有内容都是非推论上下文,这是防止从T
推论pointer
的原因。即使pointer
必须始终为T*
,这也可以使这类推论指南失败。仅仅通过将其设为非推导上下文将阻止该构造函数生成的任何推导指南的可行性。