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

时间:2017-06-26 13:51:28

标签: 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 *&'
}

根据上面的代码,simple_ptrptr_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  

1 个答案:

答案 0 :(得分:5)

  

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

不同之处在于simple_ptr是指向var的不可变指针,而ptr_ref是您const &时创建的指针的&var。这两个都做同样的事情,他们只会"指向"到var

  

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

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