初始化指向var的简单指针与指向var的指针

sha*_*yex 0 c++ pointers reference

int main()
{
    int var = 10;

    int *const simple_ptr = &var;
    int *const &ptr_ref = &var;

    int * &bad_ptr_ref = &var; // ERROR: cannot convert from 'int *' to 'int *&'
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的代码,simple_ptr和之间的区别是什么ptr_ref(除了显而易见的)?

检查VC 2015 /W4和GCC 7.1 -Wall,ptr_ref看起来似乎是一个有效的结构.

它是对编译器生成的某些临时指针的引用吗?由于查看生成的汇编代码,可以看到两个用于定义的指令ptr_ref和两个lea指令:

    int *const simple_ptr = &var;
00E4220F  lea         eax,[var]  
00E42212  mov         dword ptr [simple_ptr],eax  
    int *const &ref_ptr = &var;
00E42215  lea         eax,[var]  
00E42218  mov         dword ptr [ebp-30h],eax  
00E4221B  lea         ecx,[ebp-30h]  
00E4221E  mov         dword ptr [ref_ptr],ecx  
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

给出上面的代码,simple_ptr和ptr_ref之间的区别是什么(明显的除外)?

区别在于它simple_ptr是一个不可变的指针,var而while ptr_refconst &你创建的指针&var.这两个都做同样的事情,他们只会"指出" var.

它是对编译器生成的某些临时指针的引用吗?

对,就是这样.的operator &(忽略重载)返回一个指向应用到对象.该指针由值返回,使其成为prvalue.您无法使用正常的左值引用绑定到该值,这就是int * &bad_ptr_ref = &var;失败的原因.但是,因为它ptr_ref是一个const左值引用,它将绑定到该临时值并延长它的寿命,直到引用超出范围.