一些上下文:我在使用引用时测试编译器的优化(他们非常擅长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 ;.谢谢你的回复!
答案 0 :(得分:3)
您声明ref1
和ref2
的方式使ref1
成为int
引用,但ref2
成为int
值。
在结构中有两个引用的正确声明应该是:
int &ref1, &ref2;