Here the concept
Dis the same as the conceptC
They are not. Constraints (and concept-ids) are normalized when checked for satisfaction and broken down to atomic constraints.
[temp.names]
8 A concept-id is a simple-template-id where the template-name is
a concept-name. A concept-id is a prvalue of type bool, and does not
name a template specialization. A concept-id evaluates to true if the
concept’s normalized constraint-expression ([temp.constr.decl]) is
satisfied ([temp.constr.constr]) by the specified template arguments
and false otherwise.
And the || is regarded differently in C and D:
[temp.constr.normal]
2 The normal form of an expression
Eis a constraint that is defined
as follows:
- The normal form of an expression
( E )is the normal form ofE.- The normal form of an expression
E1 || E2is the disjunction of the normal forms of E1 and E2.- The normal form of an expression
E1 && E2is the conjunction of the normal forms ofE1andE2.- The normal form of a concept-id
C<A1, A2, ..., An>is the normal form of the constraint-expression ofC, after substitutingA1,
A2, …,AnforC‘s respective template parameters in the
parameter mappings in each atomic constraint. If any such substitution
results in an invalid type or expression, the program is ill-formed;
no diagnostic is required.- The normal form of any other expression
Eis the atomic constraint whose expression isEand whose parameter mapping is the identity
mapping.
For C the atomic constraints are T::a and T::b.
For D there is only one atomic constraint that is !!(T::a || T::b).
Substitution failure in an atomic constraint makes it not satisfied and evaluate to false. C<A> is a disjunction of one constraint that is satisified, and one that is not, so it’s true. D<A> is false since its one and only atomic constraint has a substitution failure.