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

S I*_*S I 4 c++ rvalue

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

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

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

Bar*_*lly 5

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

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

const int &x = 42;
Run Code Online (Sandbox Code Playgroud)

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

const int *y = &x;
Run Code Online (Sandbox Code Playgroud)

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

因此,您可能会发现一个将这两种效果结合起来的错误.