Пытаясь запустить это код, чтобы увидеть, как анонимный объект 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
кажется разрешенный.
Почему это может быть «опасно», чтобы предотвратить это в первую очередь?
Это считается опасным из-за риска для висячих указателей. Необработанные указатели не должны указывать, как долго будет жить объект, на который они указывают. Это нестандартное поведение со стороны MSVC.
Для сравнения со ссылками, если вы должны их использовать:
MainPanel(Test const&);
MainPanel(Test &&);
Оба c’tors демонстрируют именно ту категорию значения объекта, которую они ожидают получить, и могут даже обрабатывать ее соответственно. Делая копию или каннибализируя источник. Не могу сделать это с указателями.