在为此链接做一些测试代码之后:
调用临时对象的方法是否安全?
我发现了c ++语言的一个相当奇怪的特性,我不确定它是如何工作的:
struct Test{ int i; Test(int ii):i(ii){} Test& operator=(int ii){ i = ii; return *this; } Test operator+(const Test& rhs){ return Test(i + rhs.i); } void non_const_function(){ i *= i; } }; int main(){ //code below gives errors, builtin types don't allow evil code //int i = 5+5 = 8; //int& iRef = 5+5; //int* iPtr = &(5+5); //5 = 10; Test x = Test(5) + Test(5) = 8;//assign to a temporary Test& xRef = Test(5) + Test(5);//reference to a temporary Test* xPtr = &(Test(5) + Test(5));//address of a temporary Test(5) = Test(10);//assign to a temporary Test(8).non_const_function();//call a non-const function return 0; }
xRef和xPtr都是工作指针,具有预期值.
当然我不会在真正的项目中编写这样的代码,但我仍然对如何/为何如此有用感兴趣.
我在谷歌上发现的关于这一点的唯一信息是"如果你创建一个临时的引用,临时生命周期与引用的生命周期相关联"
注意:
- 并非所有编译器都是宽容的,例如Metrowerks ARM(它是否使用GCC?)只允许const引用临时值.
编辑: -
在VC++ 2008中增加对W4的警告显示了很多错误 - 很高兴知道.
编辑2:
谢谢大家的帮助.我回去工作了,修了100个警告.
结论:从开始使用最高警告(我甚至发现了一个真正的错误,感谢/ G4)
我们一行一行:
Test x = Test(5) + Test(5) = 8;//assign to a temporary
这里没什么大不了的.临时对象仍然只是普通对象,因此赋值运算符就像对待其他任何东西一样对它们起作用.
Test& xRef = Test(5) + Test(5);//reference to a temporary
像Metroworks一样,我的GCC不允许非const引用临时.
Test* xPtr = &(Test(5) + Test(5));//address of a temporary
此外,由于显而易见的原因,海湾合作委员会警告要采取暂时的地址.
Test(5) = Test(10);//assign to a temporary
同样,这只是分配,正如我上面所解释的那样,没什么大不了的.
Test(8).non_const_function();//call a non-const function
临时对象不是常量.没有什么能阻止他们调用非const函数.