在对象中存储引用会产生奇怪的结果

时间:2017-09-16 22:15:15

标签: c++

一些上下文:我在使用引用时测试编译器的优化(他们非常擅长BTW)。 在某些时候,我通过引用结构构造函数传递了两个对象......事情变得很奇怪。我可以看到对struct之外的一个对象所做的更改,而不是另一个。

我带来了一个最简单的工作示例:我的意思是:

//TwoInts has two references to int
//For whatever reason I can only see outside changes
//done to the int pointed by ref1 !
struct TwoInts{
    int& ref1,ref2;
    TwoInts(int& r1,int& r2):ref1(r1),ref2(r2){}
};

int foo(int select){
    int a=0,b=0;
    TwoInts two(a,b);

    switch(select){
        case 1:
            a=1; //This line changes the output
            return two.ref1; //Returns 1, ok
            break;
        case 2:
            b=2; //This line DOESN'T change the output
            return two.ref2; //Returns zero!
            break;
    }
}

使用-O2

生成使用g ++ v5.4的汇编程序
foo(int):
  cmp edi, 1
  je .L3
  cmp edi, 2
  jne .L9
  xor eax, eax
  ret
.L9:
  rep ret
.L3:
  mov eax, 1
  ret

实例here

- 如果我将1传递给foo,则代码跳转到.L3并返回1,反映对a的更改;

- 但如果我将2传递给foo,则代码跳转到.L9并返回0,忽略对b进行的更改。

我不知道为什么会这样。有什么想法?

[编辑] 当你独自工作时,很容易在圈子里奔跑。实际上,ref2的类型只是int,而不是int&amp ;.谢谢你的回复!

1 个答案:

答案 0 :(得分:3)

您声明ref1ref2的方式使ref1成为int引用,但ref2成为int值。

在结构中有两个引用的正确声明应该是:

int &ref1, &ref2;