У меня есть следующий фрагмент кода.
class A {
public:
A(int) {
}
};
int a;
int main() {
A(a); // Line 'a
return 0;
}
Что я хочу делать в строке 'a - создать временный A с конструктором A::A(int). Я знаю, что это немедленно разрушит. Это то, что я хочу. Но похоже, что компилятор делает что-то эквивалентное A a, определяя переменную A как класс A и инициализируя ее с помощью конструктора A::A(). Конечно, этого не существует, следовательно, ошибка компилятора.
Однако, если я изменю свой код на следующий.
class A {
public:
A(int) {
}
};
void f(A) {
}
int a;
int main() {
f(A(a));
return 0;
}
Теперь он отлично работает. Компилятор создает временный A и использует его для вызова f.
Почему A(a) отличается в обоих контекстах? Как это указано в стандарте или по какой-то неясной причине? Как я могу создать временный объект, как в первом примере кода?