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