繁体   English   中英

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

[英]Initialize simple pointer to var vs. reference to pointer to var

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的指令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  

给出上面的代码,simple_ptr和ptr_ref有什么区别(显而易见的除外)?

不同之处在于simple_ptrvar的不变指针,而ptr_refconst &指向在执行&var时创建的指针。 虽然这两个都做同样的事情,但它们只会“指向” var

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM