#include <iostream>
using namespace std;
struct A
{
A()
: _p(new int(1))
{}
~A()
{
*_p = 0;
delete _p;
_p = nullptr;
}
int* _p;
};
int main()
{
//
// Let r_to_a reference to a temporary object
//
A& r_to_a = A();
//
// Is r_to_a still valid now?
//
cout << *r_to_a._p << endl; // Output : 1 instead of a run-time error
}
Как я уже знал, неконстантные ссылки на временные объекты плохо сформированы. Тем не менее, приведенный выше код показывает, что это кажется законным в C ++. Зачем?
Мой компилятор VC ++ 2013.
Код на самом деле не показывает, что он допустим в C ++. Это просто показывает, что ваш компилятор поддерживает нестандартное расширение компилятора. Вы должны проконсультироваться со своими документами компилятора, чтобы узнать, продлен ли срок действия временного. Ваш эксперимент показывает, что он продлен.
Тем не менее, ваш код плохо сформирован в стандарте C ++. Если вы отключите расширения компилятора в этом компиляторе с помощью /Za
Опция также откажется принять ваш код:
error C2440: 'initializing' : cannot convert from 'A' to 'A &'
В качестве альтернативы, чтобы избежать использования /Za
(который явно сломан) вы можете сделать
#pragma warning(error : 4239)
или измените соответствующую настройку проекта в разделе C/C++ -> Advanced -> Treat Specific Warnings As Errors
запретить эту конкретную функциональность более целенаправленным образом.
Других решений пока нет …