Еще один случай, когда g ++ и clang ++ ведут себя по-разному с переменными шаблонами
Учитывая следующую программу
#include <utility>
template <typename ... Ks>
struct foo
{
template <typename ... Vs>
foo (std::pair<Ks, Vs> ...)
{ }
};
int main ()
{
foo<int> f0{std::pair<int, char>{}};
}
clang ++ компилируется без проблем, где g ++ выдает следующую ошибку
tmp_004-17,gcc,clang.cpp: In function ‘int main()’:
tmp_004-17,gcc,clang.cpp:28:39: error: no matching function for call to ‘foo<int>::foo(<brace-enclosed initializer list>)’
foo<int> f0{std::pair<int, char>{}};
^
tmp_004-17,gcc,clang.cpp:22:4: note: candidate: ‘template<class ... Vs> foo<Ks>::foo(std::pair<Ks, Vs>...)’
foo (std::pair<Ks, Vs> ...)
^~~
tmp_004-17,gcc,clang.cpp:22:4: note: template argument deduction/substitution failed:
tmp_004-17,gcc,clang.cpp:28:39: note: mismatched types ‘Vs’ and ‘char’
foo<int> f0{std::pair<int, char>{}};
^
tmp_004-17,gcc,clang.cpp:19:8: note: candidate: ‘constexpr foo<int>::foo(const foo<int>&)’
struct foo
^~~
tmp_004-17,gcc,clang.cpp:19:8: note: no known conversion for argument 1 from ‘std::pair<int, char>’ to ‘const foo<int>&’
tmp_004-17,gcc,clang.cpp:19:8: note: candidate: ‘constexpr foo<int>::foo(foo<int>&&)’
tmp_004-17,gcc,clang.cpp:19:8: note: no known conversion for argument 1 from ‘std::pair<int, char>’ to ‘foo<int>&&’
Не совсем понятно, но мне кажется, что у g ++ есть проблема смешивания расширения / вычитания вариадического шаблона для класса / структуры (Ks...
) и аргументов шаблона методов (Vs...
).
Как обычно, вопрос: кто прав? g ++ или clang ++?