Created on 2023-09-14.00:00:00 last changed 6 months ago
Proposed resolution (approved by CWG 2023-10-06):
Change in 7.6.9 [expr.rel] paragraph 3 as follows:
The usual arithmetic conversions (7.4 [expr.arith.conv]) are performed on operands of arithmetic or enumeration type. If both operands are pointers, pointer conversions (7.3.12 [conv.ptr]), function pointer conversions (7.3.14 [conv.fctptr]), and qualification conversions (7.3.6 [conv.qual]) are performed to bring them to their composite pointer type (7.2.2 [expr.type]). After conversions, the operands shall have the same type.
[Accepted as a DR at the November, 2023 meeting.]
Consider:
void f() {} void g() noexcept {} void q() { bool b1 = f == g; // OK bool b2 = f > g; // error: different types }
For the equality operators, 7.6.10 [expr.eq] paragraph 3 specifies:
If at least one of the operands is a pointer, pointer conversions (7.3.12 [conv.ptr]), function pointer conversions (7.3.14 [conv.fctptr]), and qualification conversions (7.3.6 [conv.qual]) are performed on both operands to bring them to their composite pointer type (7.2.2 [expr.type]). Comparing pointers is defined as follows: ...
In contrast, the corresponding rule for relational operators in 7.6.9 [expr.rel] paragraph 3 specifies:
The usual arithmetic conversions (7.4 [expr.arith.conv]) are performed on operands of arithmetic or enumeration type. If both operands are pointers, pointer conversions (7.3.12 [conv.ptr]) and qualification conversions (7.3.6 [conv.qual]) are performed to bring them to their composite pointer type (7.2.2 [expr.type]). After conversions, the operands shall have the same type.
However, all major implementations accept the example.
History | |||
---|---|---|---|
Date | User | Action | Args |
2024-04-05 21:43:46 | admin | set | status: dr -> drwp |
2023-12-19 10:15:28 | admin | set | status: ready -> dr |
2023-10-06 22:55:13 | admin | set | status: open -> ready |
2023-09-16 08:00:19 | admin | set | messages: + msg7438 |
2023-09-14 00:00:00 | admin | create |