Роль параметров шаблона по умолчанию в разрешении перегрузки (частично специализированных) шаблонов классов - PullRequest
0 голосов
/ 07 июня 2018

Этот ответ объясняет поведение следующей программы:

template<typename A, typename B = int >
struct FirstWins {
    static constexpr int i = 1;
};
template<typename A>
struct FirstWins<A, float/* anything different from int */ > {
    static constexpr int i = 2;
};

template<typename A, typename B = int >
struct SecondWins {
    static constexpr int i = 1;
};
template<typename A>
struct SecondWins<A, int > {
    static constexpr int i = 2;
};

int main()
{
    typedef void Whatever_t;
    cout << FirstWins < Whatever_t >::i << endl;  // prints 1
    cout << SecondWins< Whatever_t >::i << endl;  // prints 2
    return 0;
}

Однако я не могу найти фактическую ссылку, описывающую явно это поведение и тем самым подтверждающую ответ.

Я не смог найти на cppreference.com предложение, подтверждающее, что явные аргументы шаблона предпочтительнее, чем параметры по умолчанию.

Я подозреваю, что это не совсем правило.Правило состоит в том, что всякий раз, когда существует частичная специализация шаблона, соответствующая аргументам шаблона, эта специализация всегда выбирается вместо создания основного шаблона.Это правильно?(в этом случае документы как-то объясняют это правило, но опять же не явно).

1 Ответ

0 голосов
/ 07 июня 2018
template<typename A, typename B = int >
struct S {
//...
};

Может рассматриваться как

template<typename A, typename B = int >
struct S;
// So S<A> is S<A, int>

// Primary template
template<typename A, typename B>
struct S
{
   //...
};

// Possible specialization as
template<typename A>
struct S<A, int>
{
   //...
};

, тогда более понятно, какой экземпляр использовать.

...