Почему анонимный объект, переданный как указатель, запрещен для некоторых компиляторов?

Пытаясь запустить это код, чтобы увидеть, как анонимный объект ctor / dctor вызывается в одном выражении:

#include <math.h>
#include <iostream>

using namespace std;

class Test {
public:
int mA = 0;

Test() {
mA = 1000;
cout << "ctor test" << endl;
}
~Test() {
cout << "dctor test" << endl;
}
};

class MainPanel {
public:
Test mTest;

MainPanel(Test *test) : mTest(*test) {
cout << "ctor main" << endl;
}
~MainPanel() {
cout << "dctor main" << endl;
}
};

Test Crea() {
cout << "crea" << endl;
return Test();
}

int main()
{
cout << "init " << endl;
MainPanel mainPanel = MainPanel(&Crea());
cout << mainPanel.mTest.mA << endl;
cout << "end " << endl;
}

Но (например, здесь с на g++) это отрицает этот код: error: taking address of temporary [-fpermissive]

Вместо этого на msvc кажется разрешенный.

Почему это может быть «опасно», чтобы предотвратить это в первую очередь?

0

Решение

Это считается опасным из-за риска для висячих указателей. Необработанные указатели не должны указывать, как долго будет жить объект, на который они указывают. Это нестандартное поведение со стороны MSVC.

Для сравнения со ссылками, если вы должны их использовать:

MainPanel(Test const&);
MainPanel(Test &&);

Оба c’tors демонстрируют именно ту категорию значения объекта, которую они ожидают получить, и могут даже обрабатывать ее соответственно. Делая копию или каннибализируя источник. Не могу сделать это с указателями.

2

Другие решения

Visual Studio допускает это как «нестандартное расширение». Увидеть Вот.

Обсуждается причина, по которой это не разрешено в стандарте C ++ Вот.

1

По вопросам рекламы [email protected]