Вы найдете объяснение прямо на странице, на которую вы ссылаетесь:
Разъединение имеет короткое замыкание: если есть аргумент типа шаблона Bi
с bool(Bi::value) != false
, то создание экземпляра disjunction<B1, ..., BN>::value
не требует создания экземпляра Bj::value
для j> i
Режим короткого замыкания касается элемента value
каждого типа параметра, а не самого типа параметра. Вы не можете создать экземпляр шаблона, не зная его параметров. А использование std::disjunction<…>
обычно требует создания экземпляра. В вашем примере
std::disjunction_v<std::true_type, std::bool_constant<does_not_compile()>>
компилятору все еще нужно создать экземпляр std::bool_constant<does_not_compile()>
, чтобы он знал, каким будет весь std::disjunction<…>
(как вы сами отметили). Что гарантировано, так это то, что он не будет создавать экземпляр std::bool_constant<does_not_compile()>::value
& hellip;