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 ++?