How do template aliases affect template parameter deduction?

前端 未结 3 1270
情歌与酒
情歌与酒 2020-12-20 13:41

In C++03, template parameter deduction does not occur in some contexts. For example:

template  struct B {};

template 
st         


        
相关标签:
3条回答
  • 2020-12-20 14:17

    In other words, are template aliases a deduced context or a non-deduced context?

    They are as deducible as the equivalent code without using template aliases. For example

    template<typename T>
    using ref = T&;
    
    template<typename T>
    void f(ref<T> r);
    

    Now you can call f(x) and T will be deduced perfectly fine. At the definition time of f already, ref<T> is replaced by type T&. And T& is a deduced context.

    In your case C<T> is replaced by typename A<T>::type, and that is a non-deduced context for T, so T cannot be deduced.

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

    I think the relevant quote in the C++ standard is 14.5.7 [temp.alias] paragraph 2:

    When a template-id refers to the specialization of an alias template, it is equivalent to the associated type obtained by substitution of its template-arguments for the template-parameters in the type-id of the alias template. [ Note: An alias template name is never deduced. — end note ]

    There is an example following the quote which effectively spells out that it is pointless to use an alias template in a function template and hoping to deduce the template argument. This apparently applies even for situation which don't involve nested types.

    0 讨论(0)
  • 2020-12-20 14:19

    Imagine this:

    template <typename T> struct Foo { typedef   T type; }
    template <> struct Foo<char>     { typedef int type; }
    
    template <typename T> using mytype = typename Foo<T>::type;
    
    template <typename T> void f(mytype<T>);
    

    Now if I want int n; f(n);, how could I decide whether I want T = int or T = char? The whole problem, which is unaffected by template aliases, is that you cannot deduce backwards to all the things that could possibly define something.

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