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, указывающую результат посредством доступа к статическому члену value
, который унаследован либо от std::false_type
, либо от std::true_type
. или альтернативно путем преобразования экземпляра признака типа с помощью оператора преобразования.
Здесь вы показываете простую черту типа, которая всегда (для всех T
) оценивается как std::false_type
. Он используется в static_asserts
, который всегда должен давать сбой при создании экземпляра шаблона, в котором они расположены. Это необходимо, потому что static_assert
, который не зависит от параметра шаблона, запускается уже в точке определения, а не в точке инстанцирования, что делает каждую программу, содержащую что-то вроде static_assert(false);
, неправильно сформированной.
person
walnut
schedule
04.11.2019