为什么我们可以对临时对象进行非常量引用并延长其生命周期? #包括 使用名称空间std; 结构A { () :(新国际(1) {} ~A() { *_p=0; 删除(p); _p=nullptr; } int*(p); }; int main() { // //让r_to_作为对临时对象的引用 // A&r_to_A=A(); // //r_to_a现在仍然有效吗? // CUT< P>代码并没有真正显示它在C++中是合法的。它只是简单地显示了编译器支持非标准编译器扩展。您必须查阅编译器文档来了解临时的生存期是否延长。 但是,你的代码在标准C++中是不正确的,如果你使用/ZA选项禁用编译器中的编译器扩展,它也将拒绝接受你的代码: #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 }

为什么我们可以对临时对象进行非常量引用并延长其生命周期? #包括 使用名称空间std; 结构A { () :(新国际(1) {} ~A() { *_p=0; 删除(p); _p=nullptr; } int*(p); }; int main() { // //让r_to_作为对临时对象的引用 // A&r_to_A=A(); // //r_to_a现在仍然有效吗? // CUT< P>代码并没有真正显示它在C++中是合法的。它只是简单地显示了编译器支持非标准编译器扩展。您必须查阅编译器文档来了解临时的生存期是否延长。 但是,你的代码在标准C++中是不正确的,如果你使用/ZA选项禁用编译器中的编译器扩展,它也将拒绝接受你的代码: #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++,c++11,reference,object-lifetime,temporary-objects,C++,C++11,Reference,Object Lifetime,Temporary Objects,或者,为了避免使用/Za(显然已损坏),您可以 error C2440: 'initializing' : cannot convert from 'A' to 'A &' 或者在C/C++->Advanced->Treat Specific warning As Errors下更改相应的项目设置,以更具针对性的方式禁止此特定功能。当您显式禁用扩展时,它也将无法编译自己的标题;-)@rubenvb:我感觉它可能无法编译WindowsA禁用扩展的PI头。但是标准头应该是可编译的。(如果我

或者,为了避免使用
/Za
(显然已损坏),您可以

error C2440: 'initializing' : cannot convert from 'A' to 'A &'

或者在
C/C++->Advanced->Treat Specific warning As Errors
下更改相应的项目设置,以更具针对性的方式禁止此特定功能。

当您显式禁用扩展时,它也将无法编译自己的标题;-)@rubenvb:我感觉它可能无法编译WindowsA禁用扩展的PI头。但是标准头应该是可编译的。(如果我错了,请更正。)@AndreyT:我肯定记得关于这一点的一些巨大争论:在某个时候,MSVC的库实现者正式声明他们不支持
/Za
。也许是因为
/Za
模式中有一个bug?我觉得这包括了标准库,但我不记得细节(或者甚至是什么标题),很可能从那时起它就被修复了。它只是坏了。请参阅STL(缩写,而不是首字母缩写)给那些显然使用该选项强制执行标准的开发人员的官方消息。@rubenvb:是的,我想就是这个。请注意/W4“警告大多数扩展”,我认为这是一种说法,“编译器团队没有计划发布一致性实现,所以我们,库团队,对它们洗手不干”——)
#pragma warning(error : 4239)