constexpr算法all_of编译器错误

时间:2019-07-07 12:42:28

标签: c++ algorithm c++17 constexpr

我有这小段代码:

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发出诊断信息(叮当声也发出类似的错误):

  

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(begin(v2),end(v2),eqOne);

我知道自C ++ 17起的lamda可以是constexpr,而且std::begin和&& std::end都被标记为constexpr。此外,std::array也可以是constexpr。因此,为什么编译器没有选择std::all_of的constexpr版本而抱怨它不是?

1 个答案:

答案 0 :(得分:4)

std::all_of从c ++ 20开始仅是constexpr。而且libstdc ++还不支持此功能。

libc ++自llvm-7起已受支持,但即使使用clang,您可能仍会使用libstdc ++。

请参阅: