Со следующим кодом g ++ завершается ошибкой:
template <typename X = int, typename T, typename ...R>
inline void func(const T&, R...) {}
template <typename T>
struct S {};
template <typename X = int, typename T, typename ...R>
inline void func(const S<T>&, R...) {}
int main() {
func(42);
func(S<int>()); // OK
func(S<int>(), 1); // NOK
func<int>(S<int>(), 1); // NOK
}
с:
<source>: In function 'int main()':
<source>:13:21: error: call of overloaded 'func(S<int>, int)' is ambiguous
func(S<int>(), 1); // NOK
^
<source>:13:21: note: candidates are:
<source>:2:17: note: void func(const T&, R ...) [with X = int; T = S<int>; R = {int}]
inline void func(const T&, R...) {}
^
<source>:8:17: note: void func(const S<T>&, R ...) [with X = int; T = int; R = {int}]
inline void func(const S<T>&, R...) {}
^
<source>:14:26: error: call of overloaded 'func(S<int>, int)' is ambiguous
func<int>(S<int>(), 1); // NOK
^
...
Воспроизводится с помощью gcc v4.8.1 и v9.1. Компилируется с помощью clang (v3.0.0 и v8.0.0), icc (v13.0.1 и v19.0.1), msvc (v19.14 и v19.20).
Код действителен или это ошибка в gcc?
РЕДАКТИРОВАТЬ: Спасибо всем, ваши отзывы были полезны для меня. К вашему сведению, ошибка 90642 была подана; с нетерпением жду определенного ответа.