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

Не должен временный 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

Живой пример

2 ответа

Решение

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

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

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

Как продолжение ответа @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;
Другие вопросы по тегам