为什么有些c ++编译器会让你获取文字的地址?

时间:2009-07-22 16:06:59

标签: c++ rvalue

我不会命名的C ++编译器允许你获取文字的地址,int * p =& 42;

显然42是一个r值,大多数编译器拒绝这样做。

为什么编译器允许这样做?除了射击自己之外,你能做些什么?

5 个答案:

答案 0 :(得分:5)

如果需要指向值为42的整数的指针,该怎么办? :)

C ++引用很像自动解引用指针。可以创建对文字的常量引用,如下所示:

const int &x = 42;

它实际上要求编译器使用值为42的整数的地址初始化指针,因为您可能随后执行此操作:

const int *y = &x;

将此与编译器需要具有逻辑来区分未采用其地址的值和具有该地址的值的事实相结合,因此它知道将其存储在存储器中。第一个不需要具有存储器位置,因为它可以完全是临时的并存储在寄存器中,或者可以通过优化来消除。获取值的地址可能会引入编译器无法跟踪和禁止优化的别名。因此,应用 & 运算符可能会将值强加到内存中。

所以,你可能会发现一个结合了这两种效果的错误。

答案 1 :(得分:3)

因为42是生命,宇宙和一切的答案。当被问及其地址时,答案本身就是答案。

答案 2 :(得分:0)

脸颊上的舌头(完全没有坚硬):

我会说在C ++应用程序代码中取一个整数的地址,无论是左值还是右值几乎总是一个错误。即使使用整数,除了控制循环或计数之外做任何事情都可能是设计错误,如果你需要将一个整数传递给可能改变它的函数,请使用引用。

答案 3 :(得分:0)

在C ++ 0x中找到与rvalue引用相关的东西 - 移动语义 http://www.artima.com/cppsource/rvalue.html

答案 4 :(得分:0)

  

它实际上要求编译器使用值为42

的整数的地址初始化指针

那么为什么在某些编译器中,我们不能直接使用文字的地址

int* ptr = &10;

参考:

int& ref = 10;

与指针几乎相同,但是......