g ++和clang ++对于类/方法可变参数模板类型的不同行为

时间:2019-05-29 21:20:53

标签: c++ variadic-templates template-deduction

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

0 个答案:

没有答案