Вывод аргументов шаблона для шаблонов классов, не работающих с gcc 8.1.0?

Я пытался создать вектор свойств. Этот вектор должен быть своего рода "меткой", которая поможет отличить другие кортежи.

Этот простой фрагмент работает на clang 6.0 и не работает ни на одной из версий GCC (пробовал только 7.3.0, 8.1.0):

#include <tuple>
#include <string>

using namespace std;

template <class... Ts>
struct vector {
    using tuple_type = std::tuple<Ts...>;

    tuple_type properties;

    template <class... Ps>
    vector(Ps&&... ps)
    : properties(std::forward<Ps>(ps)...)
    {}
};

template <class... Ps> vector(Ps&&... ps) -> vector<Ps...>;

int main() {
    vector v{ std::string("heh"), int(7) };
}

GCC 8.1.0 бросает:

./template_argument_deduction_for_class_templates.cpp: In instantiation of ‘vector<Ts>::vector(Ps&& ...) [with Ps = {std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int}; Ts = {}]’:
./template_argument_deduction_for_class_templates.cpp:22:39:   required from here
./template_argument_deduction_for_class_templates.cpp:15:38: error: no matching function for call to ‘std::tuple<>::tuple(std::__cxx11::basic_string<char>, int)’
  : properties(std::forward<Ps>(ps)...)
                                      ^
In file included from ./template_argument_deduction_for_class_templates.cpp:2:
/usr/include/c++/8.1.0/tuple:901:2: note: candidate: ‘template<class _Alloc> std::tuple<>::tuple(std::allocator_arg_t, const _Alloc&, const std::tuple<>&)’
  tuple(allocator_arg_t, const _Alloc&, const tuple&) { }
  ^~~~~
/usr/include/c++/8.1.0/tuple:901:2: note:   template argument deduction/substitution failed:
./template_argument_deduction_for_class_templates.cpp:15:38: note:   candidate expects 3 arguments, 2 provided
  : properties(std::forward<Ps>(ps)...)
                                      ^
In file included from ./template_argument_deduction_for_class_templates.cpp:2:
/usr/include/c++/8.1.0/tuple:899:2: note: candidate: ‘template<class _Alloc> std::tuple<>::tuple(std::allocator_arg_t, const _Alloc&)’
  tuple(allocator_arg_t, const _Alloc&) { }
  ^~~~~
/usr/include/c++/8.1.0/tuple:899:2: note:   template argument deduction/substitution failed:
./template_argument_deduction_for_class_templates.cpp:15:38: note:   cannot convert ‘std::forward<std::__cxx11::basic_string<char> >((* & ps#0))’ (type ‘std::__cxx11::basic_string<char>’) to type ‘std::allocator_arg_t’
  : properties(std::forward<Ps>(ps)...)
                                      ^
In file included from ./template_argument_deduction_for_class_templates.cpp:2:
/usr/include/c++/8.1.0/tuple:896:7: note: candidate: ‘constexpr std::tuple<>::tuple()’
       tuple() = default;
       ^~~~~
/usr/include/c++/8.1.0/tuple:896:7: note:   candidate expects 0 arguments, 2 provided
/usr/include/c++/8.1.0/tuple:890:11: note: candidate: ‘constexpr std::tuple<>::tuple(const std::tuple<>&)’
     class tuple<>
           ^~~~~~~
/usr/include/c++/8.1.0/tuple:890:11: note:   candidate expects 1 argument, 2 provided
/usr/include/c++/8.1.0/tuple:890:11: note: candidate: ‘constexpr std::tuple<>::tuple(std::tuple<>&&)’
/usr/include/c++/8.1.0/tuple:890:11: note:   candidate expects 1 argument, 2 provided

Почему GCC делает вывод, что Ts - пустая пачка? Я здесь ошибся или проблема с компилятором?

По этой ссылке http://en.cppreference.com/w/cpp/compiler_support GCC должна поддерживать эту функцию.

0 ответов

Другие вопросы по тегам