#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
以更有针对性的方式禁止此特定功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句