Title
Useless restriction on use of parameter in constraint-expression
Status
c++23
Section
7.5.7.5 [expr.prim.req.nested]
Submitter
Richard Smith

Created on 2019-06-10.00:00:00 last changed 9 months ago

Messages

Date: 2023-02-23.22:06:50

Additional notes (February, 2023)

After adopting paper P2280, it is no longer accurate that any use of requirement parameters makes an expression non-constant. However, the resolution as adopted makes the treatment of examples like the following uniform in requirements and other constant expression contexts:

  template<typename ArrayType> concept LargeArray =
    requires (ArrayType my_array) { requires my_array.size() > 5; }
Date: 2023-01-07.14:32:23

Proposed resolution (approved by CWG 2023-01-06):

Remove 7.5.7.5 [expr.prim.req.nested] paragraph 2, including its example:

A local parameter shall only appear as an unevaluated operand (7.2.3 [expr.context]) within the constraint-expression. [Example 2:

  template<typename T> concept C = requires (T a) {
    requires sizeof(a) == 4; // OK
    requires a == 0; // error: evaluation of a constraint variable
  };
Date: 2023-02-15.00:00:00

[Accepted as a DR at the February, 2023 meeting.]

According to 7.5.7.5 [expr.prim.req.nested] paragraph 2,

A local parameter shall only appear as an unevaluated operand (7.2.3 [expr.context]) within the constraint-expression. [Example 2:

  template<typename T> concept C = requires (T a) {
    requires sizeof(a) == 4; // OK
    requires a == 0; // error: evaluation of a constraint variable
  };

end example]

However, a can't be used in a constant expression in any event, so the restriction is meaningless, except for ruling out an expression like true ? true : a, but there seems no reason to have a special rule for such a case.

History
Date User Action Args
2023-07-16 13:00:43adminsetstatus: open -> c++23
2023-07-16 13:00:43adminsetstatus: dr -> open
2023-02-23 22:06:50adminsetmessages: + msg7208
2023-02-18 18:43:04adminsetstatus: ready -> dr
2023-02-07 14:43:26adminsetstatus: tentatively ready -> ready
2023-01-07 14:32:23adminsetstatus: open -> tentatively ready
2022-02-18 07:47:23adminsetmessages: + msg6726
2019-06-10 00:00:00admincreate