Class template argument deduction and default template parameters

前端 未结 1 579
灰色年华
灰色年华 2021-02-13 12:13

The following stripped down code doesn\'t work with the latest clang++5 but is accepted by g++7:

template
struct wrapper;

te         


        
相关标签:
1条回答
  • 2021-02-13 12:42

    This is not a quote of the Standard per se1, but I feel confident enough to consider it an answer.

    According to cppreference, on Default template arguments:

    Default template arguments that appear in the declarations and the definition are merged similarly to default function arguments:

    template<typename T1, typename T2 = int> class A;
    template<typename T1 = int, typename T2> class A;
    // the above is the same as the following:
    template<typename T1 = int, typename T2 = int> class A;
    

    But the same parameter cannot be given default arguments twice in the same scope

    template<typename T = int> class X;
    template<typename T = int> class X {}; // error
    

    This implies an implicit rule: A template type argument can be given a default type in the template declaration or template definition interchangeably.

    The behavior clang++5 exhibits is definitly a bug.


    1) Provided by user Oliv:

    [temp.param]/10

    The set of default template-arguments available for use is obtained by merging the default arguments from all prior declarations of the template in the same way default function arguments are ([dcl.fct.default]). [ Example:

    template<class T1, class T2 = int> class A;
    template<class T1 = int, class T2> class A;
    

    is equivalent to

    template<class T1 = int, class T2 = int> class A;
    

     — end example ]

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