为什么不能推导出unique_ptr的模板参数?

Nic*_*den 15 c++ templates template-argument-deduction c++17

当您从C++ 17中获得类模板参数推导时,为什么不能推导出std :: unique_ptr的模板参数?例如,这给了我一个错误:

std::unique_ptr smp(new D);
Run Code Online (Sandbox Code Playgroud)

这说"缺少类模板的参数列表".

模板参数(至少是指针类型)不应该是可以推断的吗?

看到这个:

任何声明指定变量和变量模板初始化的声明

Nat*_*ica 18

让我们看看new intnew int[10].这两个都返回了int*.没有办法告诉你是否应该unique_ptr<int>unique_ptr<int[]>.那就足够了,不提供任何类型的扣除指南.

  • 哦,所以默认使用`unique_ptr <int>`如果你想要数组那么你必须明确地这样做?我认为记住那些总是告诉它你想要的东西会更麻烦. (5认同)
  • 我看到了基本原理,但对此没有一些规则吗?就像,你必须明确定义模板参数,如果.... (3认同)

Sto*_*ica 6

我不打算重复的理由在@ NathanOliver最伟大的答案,我只是要提到的是如何的呢,力学,这是我看你也是后。您是对的,如果的构造函数unique_ptr看起来像...

explicit unique_ptr( T* ) noexcept;
Run Code Online (Sandbox Code Playgroud)

...可以推断T。编译器生成的推导指南可以正常工作。就像Nathan所说明的那样,这将是一个问题。但是构造函数是这样指定的...

explicit unique_ptr( pointer p ) noexcept;
Run Code Online (Sandbox Code Playgroud)

...别名pointer指定如下:

pointerstd::remove_reference<Deleter>::type::pointer如果存在该类型,则为T*。必须满足NullablePointer

该规范本质上意味着pointer必须是的别名__some_meta_function<T>::type。左侧的所有内容::type都是不可推论的上下文,这是防止Tfrom 的推论的原因pointer。这样,即使总是pointer需要,也可以使这类推论指南失败T*。仅仅通过将其设为非推导上下文将阻止该构造函数生成的任何推导指南的可行性。

  • 正是我要找的答案。谢谢。 (2认同)