g ++ и clang ++ различное поведение для типов шаблонов классов / методов - PullRequest
2 голосов
/ 30 мая 2019

Еще один случай, когда 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 ++?

...