Почему привязка к const ссылается на тройную копию?

Я озадачен этим:

#include <iostream>
struct X {};
void f( const X &x ) { std::cerr << &x << "\n"; }

static X x;
int main()
{
  f( x ); // Off stack address
  f( false ? X() : x ); // Different address on stack.
}

Почему второй вызов f создает временную копию?

Изменить: Этот вопрос касается не только типа X, но и того факта, что копия сделана. Мне не хватало sublety из категорий значений из принятого ответа и ожидало, что f-параметр должен связываться либо с x, либо с X(), как это происходит при перефразировании этого выражения как оператора if.

Ответ 1

Условный оператор определяет общий тип и категорию значений для своего второго и третьего операндов. Какая бы ни была выбрана ветвь (как определено условием), соответствующий операнд преобразуется в этот общий тип и категорию значений.

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

В заключение, использование самого условного оператора - это то, что заставляет копировать.