std::views::take_while
требует, чтобы оператор вызова переданного ему объекта был квалифицирован как const, чтобы дедукция была успешной:
struct non_null
{
template <typename T>
bool operator()(const T* t) const { // <-- const-qualified
return t != nullptr;
}
};
Однако, если вы просто хотите назвать предикат, вы можно просто сделать:
auto non_null = [](const auto* x) { return x != nullptr; };
и использовать его так:
for (auto e : foo | ::std::views::take_while(non_null))
std::cout << e << "\n";
Вот демо .