[diff.cpp11.expr]

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

## C.5 C++ and ISO C++ 2011 [[diff.cpp11]](diff.cpp11#expr)

### C.5.4 [[expr]](expr "7 Expressions"): expressions [diff.cpp11.expr]

[1](#1)

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

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


**Change:** A conditional expression with a throw expression as its second or third
operand keeps the type and value category of the other operand[.](#1.sentence-1)

  


**Rationale:** Formerly mandated conversions ([lvalue-to-rvalue](conv.lval "7.3.2 Lvalue-to-rvalue conversion [conv.lval]"),[array-to-pointer](conv.array "7.3.3 Array-to-pointer conversion [conv.array]"), and [function-to-pointer](conv.func "7.3.4 Function-to-pointer conversion [conv.func]") standard conversions), especially the creation of the temporary due to
lvalue-to-rvalue conversion, were considered gratuitous and surprising[.](#1.sentence-2)

  


**Effect on original feature:** Valid C++ 2011 code that relies on the conversions may behave differently
in this revision of C++[.](#1.sentence-3)

[*Example [1](#example-1)*: struct S {int x = 1; void mf() { x = 2; }};int f(bool cond) { S s; (cond ? s : throw 0).mf(); return s.x;}

In C++ 2011, f(true) returns 1[.](#1.sentence-4)

In this revision of C++,
it returns 2[.](#1.sentence-5)

sizeof(true ? "" : throw 0)

In C++ 2011, the expression yields sizeof(const char*)[.](#1.sentence-6)

In this
revision of C++, it yields sizeof(const char[1])[.](#1.sentence-7)

â *end example*]
