std :: reduce с функтором - PullRequest
       73

std :: reduce с функтором

4 голосов
/ 21 июня 2020

Я попытался использовать std::reduce с функтором для вычисления количества символов в массиве. G CC выдает ошибку, при этом компилируется и работает в MSV C. ссылка здесь

#include <iostream>
#include <array>
#include <numeric>
#include <cstring>

int main()
{
    std::array arr{ "Mickey","Minnie","Jerry" };
    struct StringLength
    {
        auto operator()(const char* l, size_t r)
        {
            return strlen(l) + r;
        }
        auto operator()(size_t l, const char* r)
        {
            return l + strlen(r);
        }
        auto operator()(const char* l, const char* r)
        {
            return strlen(l) + strlen(r);
        }
        auto operator()(size_t l, size_t r)
        {
            return l + r;
        }
    };
    std::cout << std::reduce(arr.begin(), arr.end(), size_t{}, StringLength());
    // this ^ works in MSVC
}

G CC ошибка 10.1, так как важная информация не должна быть скрыта за ссылкой:

/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/numeric:
In instantiation of '_Tp std::reduce(_InputIterator, _InputIterator, _Tp, _BinaryOperation)
[with _InputIterator = const char**; _Tp = long unsigned int;
 _BinaryOperation = main()::StringLength]':

<source>:29:78:   required from here

/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/numeric:263:21: error:
static assertion failed

  263 |       static_assert(is_convertible_v<value_type, _Tp>);
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1 Ответ

4 голосов
/ 21 июня 2020

Я согласен с dewaffled , что это ошибка. libstdc++ реализация из std::reduce выглядит так:

template<typename InputIt, typename Tp, typename BinOp>
Tp reduce(InputIt first, InputIt last, Tp init, BinOp binary_op) {
    using value_type = typename iterator_traits<InputIt>::value_type;
    static_assert(is_invocable_r_v<Tp, BinOp&, Tp&, Tp&>);
    static_assert(is_convertible_v<value_type, Tp>);
    // ...
}

Мне не удалось найти требование в стандарте этого итератора value_type должен быть конвертируемым в Tp. Более того, это требование вовсе не обязательно. Если вы удалите это stati c assert, ваш код будет компилировать как следует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...