当前位置:  开发笔记 > 编程语言 > 正文

分配给临时(例如5 = 10但用户定义的类型)

如何解决《分配给临时(例如5=10但用户定义的类型)》经验,为你挑选了1个好方法。

在为此链接做一些测试代码之后:
调用临时对象的方法是否安全?
我发现了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)



1> Pesto..:

我们一行一行:

    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函数.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有