Ответ 1
Условный оператор определяет общий тип и категорию значений для своего второго и третьего операндов. Какая бы ни была выбрана ветвь (как определено условием), соответствующий операнд преобразуется в этот общий тип и категорию значений.
В этом случае X()
и x
оба имеют тип x
, поэтому общий тип, конечно, сам x
. Но результатом является prvalue, поэтому, если выбрано x
(условие ложно), то применяется преобразование lvalue-rvalue, создавая временную копию prvalue x
, которая затем привязана к ссылке.
В заключение, использование самого условного оператора - это то, что заставляет копировать.