Этот ответ объясняет поведение следующей программы:
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 предложение, подтверждающее, что явные аргументы шаблона предпочтительнее аргументов по умолчанию.
Подозреваю, что это не совсем правило. Правило состоит в том, что при наличии частичной специализации шаблона, соответствующей аргументам шаблона, эта специализация всегда предпочтительнее реализации первичного шаблона. Это верно? (в данном случае документы каким-то образом объясняют это правило, но опять же не явно).
FirstWins<X>
разрешается какFirstWins<X, int>
. Фактический выбор определенияFirstWins<X, int>
происходит после заменыB
наint
. - person Holt   schedule 07.06.2018SecondWins<X, int>
. В этом случаеSecondWins<X, int>
предпочтительнееSecondWins<X, =int>
. - person L. Bruce   schedule 07.06.2018SecondWins<A, B=int>
ничем не отличается отSecondWins<A, B>
для выбора шаблона, поэтому специализацияSecondsWins<A, int>
предпочтительнее неспециализированной. Аргумент шаблона по умолчанию здесь не влияет на разрешение. - person Holt   schedule 07.06.2018FirstWins
. Там именно несоответствие между параметром по умолчаниюB=int
и явным параметромfloat
приводит к выбору первого.B
использование по умолчанию всего, что не являетсяfloat
, имеет значение. - person L. Bruce   schedule 07.06.2018FirstWins<X>
иSecondWins<X>
, вот и все.FirstWins<Whatever_t>
распространяется наFirstWins<Whatever_t, int>
, что не соответствует специализации, поэтому выбрана неспециализированная версия. - person Holt   schedule 07.06.2018