[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]).