У меня есть маленький кусочек кода:
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
и жалуется, что это не так?