C++ 初始化指向var的简单指针与引用指向var的指针
鉴于上述代码,简单的ptr和ptr ref之间有什么区别(除了明显的区别) 与VC 2015C++ 初始化指向var的简单指针与引用指向var的指针,c++,pointers,reference,C++,Pointers,Reference,鉴于上述代码,简单的ptr和ptr ref之间有什么区别(除了明显的区别) 与VC 2015/W4和GCC 7.1-Wall一起检查,因此ptr\u ref似乎是一个有效的构造 它是编译器偶然生成的某个临时指针的引用吗? 由于查看生成的汇编代码,可以看到定义ptr\u ref的两条指令,以及两条lea指令: int main() { int var = 10; int *const simple_ptr = &var; int *const &ptr_r
/W4
和GCC 7.1-Wall
一起检查,因此ptr\u ref
似乎是一个有效的构造
它是编译器偶然生成的某个临时指针的引用吗?
由于查看生成的汇编代码,可以看到定义ptr\u ref
的两条指令,以及两条lea
指令:
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之间有什么区别(除了明显的区别)
不同之处在于,simple\u ptr
是指向var
的不可变指针,ptr\u ref
是指向执行&var
时创建的指针的常量&
。不过,这两种方法的作用是相同的,它们只会“指向”var
它是编译器偶然生成的某个临时指针的引用吗
是的,没错。
操作符&
(忽略重载)返回指向应用于的对象的指针。该指针由使其成为prvalue的值返回。您不能使用正常的左值引用绑定到它,这就是为什么int*&bad\u ptr\u ref=&var代码>失败。但是,由于ptr\u ref
是一个const
左值引用,它将绑定到该临时引用并延长其生命,直到引用超出范围。您的问题太广泛了。把它分成几个独立的问题。关于(4):不仅指针是一样的const
引用可以绑定到任何表达式,但非const引用只能绑定到左值。它怎么太宽泛了,主要问题是在这个特定的案例中,这两个定义与仅在这个案例中的定义有什么区别。@sharyex你问了4个不同的问题(我们在这里每个问题一个问题)这只是一个问题,其他的只是强调我想要的答案和解释,它们都是指同一件事。编辑。
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