Ответ 1
Оба из них в порядке.
В §5.16 говорится (необычайно сокращенно):
2 Если либо второй, либо третий операнд имеет тип void
Неа.
3 В противном случае, если второй и третий операнды имеют разные типы
Неа.
4 Если второй и третий операнды являются glvalues одной и той же категории значений
Неа. (Во-первых, оба являются prvalues, а во втором - glvalue, а одно - prvalue.)
5 В противном случае результатом будет prvalue
Хорошо, так что оба они приводят к prvalues. Итак, привязка прекрасна, но что связывание с?
6 Для второго и третьего операндов выполняются значения Lvalue-to-rvalue (4.1), преобразования от множества к указателю (4.2) и стандартного преобразования (4.2).
Хорошо, так что оба теперь rvalues, если они еще не были.
6 (продолжение) После этих преобразований должно выполняться одно из следующих условий:
Второй и третий операнды имеют один и тот же тип; результат такого типа. Если операнды имеют тип класса, результатом является временное значение prvalue для типа результата, которое инициализируется копированием из второго операнда или третьего операнда в зависимости от значения первого операнда.
Хорошо, так что это либо std::string(first_operand)
, либо std::string(second_operand)
.
Независимо, результатом условного выражения является новое временное значение prvalue, и это значение, которое расширяется путем привязки к вашим ссылкам.