我有这小段代码:
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版本而抱怨它不是?
答案 0 :(得分:4)
std::all_of
从c ++ 20开始仅是constexpr。而且libstdc ++还不支持此功能。
libc ++自llvm-7起已受支持,但即使使用clang,您可能仍会使用libstdc ++。
请参阅: