Алгоритм constexpr all_of ошибка компилятора - PullRequest
4 голосов
/ 07 июля 2019

У меня есть маленький кусочек кода:

void all_of_examples() {
  using std::begin;
  using std::end;

  //C++17 
  //template< class InputIt, class UnaryPredicate >
  //constexpr bool all_of( InputIt first, InputIt last, UnaryPredicate p );

  constexpr auto v2 = std::array<int, 4>{1, 1, 1, 1};
  constexpr auto eqOne = [](int x) constexpr { 
                          constexpr int one = 1;
                          return x == one; 
                       };

  constexpr bool isAllV2 = std::all_of(begin(v2), end(v2), eqOne);

  std::cout << isAllV2 << std::flush << '\n';
}

gcc-8 выдает диагностику (clang также выдает похожую ошибку):

examples.cpp: 21: 41: ошибка: вызов функции, отличной от 'constexpr' bool std :: all_of (_IIter, _IIter, _Predicate) [with _IIter = const int *; _Predicate = algo :: all_of_examples () ::] ' constexpr bool isAllV2 = std :: all_of (начало (v2), конец (v2), eqOne);

Я знаю, что lamdas начиная с C ++ 17 может быть constexpr, а также std::begin && std::end оба помечены как constexpr. Кроме того, std::array также может быть constexpr. Поэтому, почему компилятор не выбирает версию constexpr std::all_of и жалуется, что это не так?

1 Ответ

4 голосов
/ 07 июля 2019

std::all_of является только constexpr с c ++ 20.Кроме того, libstdc ++ пока не поддерживает это.

libc ++ имеет поддержку начиная с llvm-7, но даже при использовании clang вы, вероятно, все еще используете libstdc ++.

См .:

...