Why can't unique_ptr's template arguments be deduced?

后端 未结 2 1998
后悔当初
后悔当初 2020-12-18 19:22

When you have class template argument deduction available from C++17, why can\'t you deduce the template arguments of std::unique_ptr? For example, this gives me an error:

相关标签:
2条回答
  • 2020-12-18 20:07

    I'm not going to repeat the rationale in @NathanOliver's great answer, I'm just going to mention the how of it, the mechanics, which is what I think you are also after. You are right that if the constructor of unique_ptr looked merely like...

    explicit unique_ptr( T* ) noexcept;
    

    ... it'd be possible to deduce T. The compiler generated deduction guide would work just fine. And that would be a problem, like Nathan illustrates. But the constructor is specified like this...

    explicit unique_ptr( pointer p ) noexcept;
    

    ... where the alias pointer is specified as follows:

    pointer : std::remove_reference<Deleter>::type::pointer if that type exists, otherwise T*. Must satisfy NullablePointer.

    That specification essentially means that pointer must be an alias to __some_meta_function<T>::type. Everything on the left of ::type is a non-deduced context, which is what prevents the deduction of T from pointer. That's how these sort of deduction guides could be made to fail even if pointer needed to be T* always. Just by making it a non-deduced context will prevent the viability of any deduction guide produced from that constructor.

    0 讨论(0)
  • 2020-12-18 20:09

    Lets look at new int and new int[10]. Both of those return an int*. There is no way to tell if you should have unique_ptr<int> or unique_ptr<int[]>. That right there is enough not to provide any sort of deduction guide.

    0 讨论(0)
提交回复
热议问题