Подтвердить что ты не робот

Разве временный A (3) не должен быть уничтожен до "Здесь"?

Должен ли временный A(3) быть уничтожен до того, как будет напечатан "Здесь"?

#include <iostream>
struct A
{
    int a;
    A() { std::cout << "A()" << std::endl; }
    A(int a) : a(a) { std::cout << "A(" << a << ")" << std::endl; }
    ~A() { std::cout << "~A() " << a << '\n'; }
};

int main()
{
    A a[2] = { A(1), A(2) }, A(3);
    std::cout << "Here" << '\n';
}

Вывод:

A(1)
A(2)
A(3)
Here
~A() 3
~A() 2
~A() 1

Живой пример

4b9b3361

Ответ 1

A(3) не является временным объектом, а объектом типа A называется A. Это та же логика, что и:

A a[2] = { A(1), A(2) }, a2(3);

Я действительно не знал, что вам разрешено это делать.

Ответ 2

В качестве расширения для @neil-kirk ответ, причина A(3) не является временной, так это то, что исходная строка

A a[2] = { A(1), A(2) }, A(3);

действительно является сокращенным объявлением двух переменных a[] и A

A a[2] = { A(1), A(2) };
A A(3);

как вы могли бы сделать

int a = 1, b = 2;

или

int a = 1;
int b = 2;