Правила неявного преобразования аргументов шаблона

Если вы перегружаете функцию, а затем вызываете ее с аргументом, который точно соответствует одной из перегруженных версий

int f(int){return 3;}
int f(bool){return 4;}
...        //inside main()
f(1);      //Calls f(int)

, компилятор просто выбирает это (идеальное) совпадение перед попыткой каких-либо неявных преобразований. Однако я пытался перегрузить функцию tempĺate, как в

template <bool veracity>
int f(){return 1;}

template <int amount>
int f(){return 2;}

...        //inside main()
f<1>();

, но компилятор продолжает жаловаться на неоднозначный вызов перегруженной f(), заявляя, что это может быть либо f(), либо f<1>(). Разве компилятор не должен просто выбрать идеальное совпадение вместо того, чтобы пытаться преобразовать 1в true?

У меня сложилось впечатление что неявное преобразование для аргументов шаблона на самом деле было более ограничивающим, чем неявное преобразование аргументов функции.Есть ли способ обойти эту проблему?

12
задан Malabarba 5 April 2012 в 15:21
поделиться