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

struct X
{
    X()    { std::cout << "X()\n";    }
    X(int) { std::cout << "X(int)\n"; }
};

const int answer = 42;

int main()
{
    X(answer);
}

Я бы ожидал, что это напечатает либо

  • X(int), потому что X(answer); можно интерпретировать как листинг из int в X, или
  • ничего, потому что X(answer); можно интерпретировать как объявление переменной.

Однако он печатает X(), и я понятия не имею, почему X(answer); будет вызывать конструктор по умолчанию.

BONUS POINTS: Что мне нужно изменить, чтобы получить временное выражение вместо объявления переменной?

Ответ 1

ничего, потому что X (ответ); может быть интерпретировано как объявление переменной.

Ваш ответ скрыт здесь. Если вы объявляете переменную, вы вызываете ее по умолчанию ctor (если не POD и все это).

На вашем редактировании: Чтобы получить временное, у вас есть несколько вариантов:

Ответ 2

Скобки являются необязательными. То, что вы сказали, идентично X answer;, и это выражение декларации.

Ответ 3

Если вы хотите объявить переменную типа X, вы должны сделать это следующим образом:

X y(answer);