У меня есть следующий фрагмент кода.
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)
отличается в обоих контекстах? Как это указано в стандарте или по какой-то неясной причине? Как я могу создать временный объект, как в первом примере кода?