Я пытаюсь выяснить, какой должна быть категория значений результата условного выражения, если его второй и третий операнды являются l-значениями типа класса.
Пример:
struct S {};
S x, y;
void foo(bool cond) {
cond ? x : y; // what is the value category of the result?
}
Я вижу, что два разных абзаца в [expr.cond]
говорят разные вещи.
Согласно пункту 4:
Если второй и третий операнды являются значениями gl с одной и той же категорией значений и имеют один и тот же тип, результат относится к этому типу и категории значений
Этот абзац кажется применимым и говорит, что результатом является lvalue, потому что второй и третий операнды являются lvalue одного типа.
Однако согласно пункту 6:
Стандартные преобразования Lvalue-to-rvalue, массива в указатель и функции в указатель выполняются для второго и третьего операндов. После этих преобразований выполняется одно из следующих действий:
- Второй и третий операнды имеют одинаковый тип; результат именно такого типа. Если операнды имеют тип класса, результатом является временное значение prvalue типа результата, которое инициализируется копией либо из второго операнда, либо из третьего операнда в зависимости от значения первого операнда.
Этот абзац также кажется применимым и говорит, что результатом выражения является rvalue.
Так что это - lvalue или rvalue? Действительно ли два абзаца противоречат друг другу, или я упускаю что-то тонкое?