Annex C (informative) Compatibility [diff]

C.3 C++ and ISO C++ 2011 [diff.cpp11]

C.3.3 Clause [expr]: expressions [diff.cpp11.expr]

[expr.cond]
Изменение: условное выражение с выражением throw в качестве второго или третьего операнда сохраняет тип и категорию значения другого операнда.
Обоснование: Ранее санкционированные преобразования (lvalue-to-rvalue, array-to-pointerи function-to-pointer стандартные преобразования), особенно создание временного вследствие Lvalue к Rvalue преобразования, было рассмотрены безвозмездным и удивительно.
Влияние на исходную функцию: действительный код C ++ 2011, который полагается на преобразования, может вести себя по-другому в этом международном стандарте:

struct S {
  int x = 1;
  void mf() { x = 2; }
};
int f(bool cond) {
  S s;
  (cond ? s : throw 0).mf();
  return s.x;
}

В C ++ 2011 f(true) возвращает 1. В этом международном стандарте он возвращается 2.

sizeof(true ? "" : throw 0)

В C ++ 2011 выражение дает sizeof(const char*). В этом международном стандарте он уступает sizeof(const char[1]).