std::false_type
используется как строительный блок в типовых чертах и определяется как std::integral_constant<bool, false>
(который я здесь пропущу). Это определение сводится к чему-то вроде этого (упрощенно):
struct false_type {
static constexpr bool value = false;
constexpr operator bool() const noexcept { return value; }
// There is more here, but it doesn't really matter for your question
};
Аналогично:
struct true_type {
static constexpr bool value = true;
constexpr operator bool() const noexcept { return value; }
// There is more here, but it doesn't really matter for your question
};
Используется для представления значений false
и true
как печатает . Это полезно для черт типа, когда вы позволяете шаблону класса наследоваться от std::false_type
или std::true_type
для разных (частичных) специализаций, в зависимости от некоторых условий, встречающихся в аргументе шаблона. Это позволяет проверить, удовлетворяет ли данный тип условию признака типа, и получить постоянную времени компиляции значение , указывающую результат через доступ к статическому члену value
, который унаследован от std::false_type
или std::true_type
или альтернатива путем преобразования экземпляра признака типа с использованием оператора преобразования.
Здесь вы видите черту простого типа, которая всегда (для всех T
) оценивается как std::false_type
. Он используется в static_asserts
, который всегда должен завершаться ошибкой, когда создается экземпляр шаблона, в котором они находятся. Это необходимо, потому что static_assert
, который не зависит от параметра шаблона, запускается уже в точке определения, а не в точке создания экземпляра, поэтому каждая программа, содержащая что-то вроде static_assert(false);
, плохо сформирована.