To determine if an atomic constraint is
satisfied,
the parameter mapping and template arguments are
first substituted into its expression
. If substitution results in an invalid type or expression
in the immediate context of the atomic constraint (
[temp.deduct.general]),
the constraint is not satisfied
. The constraint is satisfied if and only if evaluation of
E
results in
true. If, at different points in the program, the satisfaction result is different
for identical atomic constraints and template arguments,
the program is ill-formed, no diagnostic required
. [
Example 3:
template<typename T> concept C =
sizeof(T) == 4 && !true;
template<typename T> struct S {
constexpr operator bool() const { return true; }
};
template<typename T> requires (S<T>{})
void f(T);
void f(int);
void g() {
f(0);
}
—
end example]