Почему STD :: Predicat требует * неявного * преобразования в Bool?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему STD :: Predicat требует * неявного * преобразования в Bool?

Сообщение Anonymous »

Можно кто -нибудь объяснить, почему концепция std :: Predicate требует, чтобы результат предиката не был неявно преобразован в Bool (то есть он не разрешал объекты, чей оператор Bool Явный спецификатор < /code> будет использоваться в качестве предиката)?
Пример: < /p>

Код: Выделить всё

class TA
{
public:
operator bool() const noexcept
{
return {};
}
};

class TB
{
public:
explicit operator bool() const noexcept
{
return {};
}
};

void test_predicate()
{
static_assert(std::predicate); //Ok
static_assert(std::predicate); //Failed
}
Фактически, предикаты используются только в выборе и итерационных операторах, и такие операторы позволяют использовать явное оператор Bool .
std :: Predicate Ограничения кажутся избыточными, и это имеет последствия на практике.
Например, чтобы определить, сколько элементов std :: vector иметь значение, вы можете просто написать:

Код: Выделить всё

std::count_if(A.begin(), A.end(), std::identity{});< /code> < /p>
Но вы не можете написать то же самое, используя ограниченные
алгоритмы:
std::ranges::count_if(A, std::identity{}); \\compile error


Подробнее здесь: https://stackoverflow.com/questions/794 ... on-to-bool
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»