4

一个我不会命名的 C++ 编译器可以让您获取文字地址 int *p = &42;

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

为什么编译器会允许这样做?除了朝自己的脚开枪之外,你还能做什么?

4

5 回答 5

5

如果您需要一个指向值为 42 的整数的指针怎么办?:)

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

const int &x = 42;

它实际上要求编译器使用值为 42 的整数地址初始化一个指针,您可能随后会这样做:

const int *y = &x;

再加上编译器需要有逻辑来区分一个没有被占用地址的值和一个已经被占用的值,所以它知道将它存储在内存中。第一个不需要有内存位置,因为它可以完全是临时的并存储在寄存器中,或者可以通过优化消除。获取值的地址可能会引入编译器无法跟踪并禁止优化的别名。因此,应用&运算符可能会强制将该值(无论它是什么)存入内存。

因此,您可能发现了结合这两种效果的错误。

于 2009-07-22T16:20:14.910 回答
3

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

于 2009-07-22T16:12:27.297 回答
0

舌头在脸颊上微微(绝不完全是坚果):

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

于 2009-07-22T16:26:01.450 回答
0

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

于 2009-07-24T07:09:35.830 回答
0

它实际上要求编译器使用值为 42 的整数地址初始化指针

那么,为什么在某些编译器中,我们不能直接获取文字的地址呢?

int* ptr = &10;

参考资料:

int& ref = 10;

几乎和指针一样,虽然......

于 2010-02-11T19:13:28.340 回答