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)
给出上面的代码,simple_ptr和ptr_ref之间的区别是什么(明显的除外)?
区别在于它simple_ptr是一个不可变的指针,var而while ptr_ref是const &你创建的指针&var.这两个都做同样的事情,他们只会"指出" var.
它是对编译器生成的某些临时指针的引用吗?
对,就是这样.的operator &(忽略重载)返回一个指向应用到对象.该指针由值返回,使其成为prvalue.您无法使用正常的左值引用绑定到该值,这就是int * &bad_ptr_ref = &var;失败的原因.但是,因为它ptr_ref是一个const左值引用,它将绑定到该临时值并延长它的寿命,直到引用超出范围.