[英]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_ptr
和ptr_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_ptr
是var
的不变指针,而ptr_ref
是const &
指向在执行&var
时创建的指针。 虽然这两个都做同样的事情,但它们只会“指向” var
。
它是对编译器偶然生成的某些临时指针的引用吗?
对,就是这样。 operator &
(忽略重载)返回一个指向所应用对象的指针。 该指针由使其成为prvalue的值返回。 您不能使用普通的左值引用将其绑定,这就是为什么int * &bad_ptr_ref = &var;
失败。 但是,由于ptr_ref
是一个const
左值引用,它将绑定到该临时对象并延长其寿命,直到该引用超出范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.