LINUX.ORG.RU

Шаблонный оператор + fold expression + variadic templates = ругается clang

 ,


1

4

Решил я поиграться с fold expression в c++1z, сделал шаблонный оператор, который объединяет два кортежа

template <class... Args1, class... Args2>
constexpr decltype(auto) operator+(const ::std::tuple<Args1...> &tup1,
                                   const ::std::tuple<Args2...> &tup2) {
   return ::std::tuple_cat(tup1, tup2);
}

template <class... Args1, class... Args2>
constexpr decltype(auto) operator+(::std::tuple<Args1...> &&tup1,
                                   ::std::tuple<Args2...> &&tup2) {
   return ::std::tuple_cat(tup1, tup2);
}

И вроде бы отлично работает для двух параметров

template <class Arg1, class Arg2>
constexpr decltype(auto) concat_test(Arg1 &&arg1, Arg2 &&arg2) {
   return arg1 + arg2;
}

Но вот беда, если пытаюсь соединить таким образом n кортежей, то gcc скомпилирует это все нормально, а clang на меня ругается

constexpr decltype(auto) multiple_concat() {
  return ::std::make_tuple();
}

template <class... Args>
constexpr decltype(auto) multiple_concat(Args &&... args) {
   return (args + ...);
}

И вот я думаю, толь clang мой не едет, толь я - тупой

Выхлоп clang'а:

error: call to function 'operator+' that is neither visible in the template definition nor found by argument-dependent lookup return (args + ...);

note: in instantiation of function template specialization 'multiple_concat<std::__1::tuple<int, int> &, std::__1::tuple<int, char> &>' requested here multiple_concat(tup1, tup2);

note: 'operator+' should be declared prior to the call site constexpr decltype(auto) operator+(const ::std::tuple<Args1...> &tup1,

1 error generated.

Пример на Wanbox'е

P.S: Не работает ни с 4.0.1, ни с 5.0 (branches/release_50 309888), ни с 6.0 (trunk 310399) версией

Ответ на: комментарий от KennyMinigun

Г-ди, я бы сам, наверно, и не догадался занести опреатор в std. Тогда сразу другой вопрос возникает: почему concat_test работает если оператор находится в глобальном пространстве имен(namespace)? Ладно, зарепорчу ка я разрабам баг, а дальше пускай они сами разбираются

maxis11 ()
Ответ на: комментарий от maxis11

почему concat_test работает если оператор находится в глобальном пространстве имен(namespace)?

Вот это возможно баг. Опять стандарт шерстить... леееень.

Приведу цитату с гайда GTest:

// It's important that the << operator is defined in the SAME
// namespace that defines Bar.  C++'s look-up rules rely on that.

Т.е. как-бы намекают, что они уже проверили...

KennyMinigun ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.