[expr.prim.req.general] (original) (raw)

7 Expressions [expr]

7.5 Primary expressions [expr.prim]

7.5.8 Requires expressions [expr.prim.req]

7.5.8.1 General [expr.prim.req.general]

A requires-expression provides a concise way to express requirements on template arguments that can be checked by name lookupor by checking properties of types and expressions.

A requires-expression is a prvalue of type boolwhose value is described below.

[Example 1:

A common use of requires-expressions is to define requirements in concepts such as the one below:template<typename T> concept R = requires (T i) { typename T::type;{*i} -> std::convertible_to<const typename T::type&>;};

A requires-expression can also be used in arequires-clause ([temp.pre]) as a way of writing ad hoc constraints on template arguments such as the one below:template<typename T> requires requires (T x) { x + x; } T add(T a, T b) { return a + b; }

The first requires introduces therequires-clause, and the second introduces the requires-expression.

— _end example_]

A local parameter of a requires-expression shall not have a default argument.

The type of such a parameter is determined as specified for a function parameter in [dcl.fct].

These parameters have no linkage, storage, or lifetime; they are only used as notation for the purpose of defining requirements.

[Example 2: template<typename T> concept C = requires(T t, ...) { t;};template<typename T> concept C2 = requires(T p[2]) { (decltype(p))nullptr; }; — _end example_]

The substitution of template arguments into a requires-expressioncan result in the formation of invalid types or expressions in the immediate context of its requirements ([temp.deduct.general]) or the violation of the semantic constraints of those requirements.

In such cases, the requires-expression evaluates to false; it does not cause the program to be ill-formed.

The substitution and semantic constraint checking proceeds in lexical order and stops when a condition that determines the result of the requires-expression is encountered.

If substitution (if any) and semantic constraint checking succeed, the requires-expression evaluates to true.

[Note 1:

If a requires-expression contains invalid types or expressions in its requirements, and it does not appear within the declaration of a templated entity, then the program is ill-formed.

— _end note_]

If the substitution of template arguments into a requirementwould always result in a substitution failure, the program is ill-formed; no diagnostic required.

[Example 3: template<typename T> concept C = requires { new decltype((void)T{}); }; — _end example_]