[diff.cpp23.expr]

# Annex C (informative) Compatibility [[diff]](./#diff)

## C.1 C++ and ISO C++ 2023 [[diff.cpp23]](diff.cpp23#expr)

### C.1.3 [[expr]](expr "7 Expressions"): expressions [diff.cpp23.expr]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L49)

**Affected subclause:** [[expr.arith.conv]](expr.arith.conv)  


**Change:** Operations mixing a value of an enumeration type and a value of a different
enumeration type or of a floating-point type are no longer valid[.](#1.sentence-1)

  


**Rationale:** Reinforcing type safety[.](#1.sentence-2)

  


**Effect on original feature:** A valid C++ 2023 program that performs operations mixing a value of an
enumeration type and a value of a different enumeration type or of a
floating-point type is ill-formed[.](#1.sentence-3)

[*Example [1](#example-1)*: enum E1 { e };enum E2 { f };bool b = e <= 3.7; // ill-formed; previously well-formedint k = f - e; // ill-formed; previously well-formedauto x = true ? e : f; // ill-formed; previously well-formed â *end example*]

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L69)

**Affected subclauses:** [[expr.rel]](expr.rel) and [[expr.eq]](expr.eq)  


**Change:** Comparing two objects of array type is no longer valid[.](#2.sentence-1)

  


**Rationale:** The old behavior was confusing since it compared not the contents of the two
arrays, but their addresses[.](#2.sentence-2)

  


**Effect on original feature:** A valid C++ 2023 program directly comparing two array objects is rejected as
ill-formed in this document[.](#2.sentence-3)

[*Example [2](#example-2)*: int arr1[5];int arr2[5];bool same = arr1 == arr2; // ill-formed; previously well-formedbool idem = arr1 == +arr2; // compare addressesbool less = arr1 < +arr2; // compare addresses, unspecified result â *end example*]

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L88)

**Affected subclause:** [[expr.delete]](expr.delete)  


**Change:** Calling delete on a pointer to an incomplete class is ill-formed[.](#3.sentence-1)

  


**Rationale:** Reduce undefined behavior[.](#3.sentence-2)

  


**Effect on original feature:** A valid C++ 2023 program that calls delete on an incomplete
class type is ill-formed[.](#3.sentence-3)

[*Example [3](#example-3)*: struct S;

void f(S *p) {delete p; // ill-formed; previously well-formed}struct S {}; â *end example*]
