C++ 左值引用
C++ lvalue references
所以最近我重新访问了有关类型声明的参考资料,但我不太理解它们。
考虑这个虚拟代码:
int ia = 10;
int& ref = ia;
现在,我的问题是:
- 这些
int& ref
在内部是如何工作的,这是否意味着ref
的地址被分配给ia
的地址,如果不是,则等于&ia
那么编译器在看到这些引用后会做什么呢?
- 为什么这些 引用 没有在 C++ 程序中编译?
您根本不必考虑地址。 ref
只是 ia
的别名,或者换句话说,ref
是 ia
的别名。只是代码的语法糖。
这种情况下的编译器根本不需要做太多,只需跟踪代码何时包含ref
,将其替换为ia
。
C++ 标准未指定编译器应如何实现引用。很多人认为它们只是别名,但实际上,在幕后它们只是作为 const
指针实现的。
C++ 引用在底层是 const
指针。所以:
int ia = 10;
int& ref = ia;
ref++; // ia is 11 now
可能会被编译器转换为:
int ia = 10;
int* const ref = ia;
(*ref)++; // ia is 11 now
它们需要初始化,因为常量必须被初始化。
所以最近我重新访问了有关类型声明的参考资料,但我不太理解它们。
考虑这个虚拟代码:
int ia = 10;
int& ref = ia;
现在,我的问题是:
- 这些
int& ref
在内部是如何工作的,这是否意味着ref
的地址被分配给ia
的地址,如果不是,则等于&ia
那么编译器在看到这些引用后会做什么呢? - 为什么这些 引用 没有在 C++ 程序中编译?
您根本不必考虑地址。 ref
只是 ia
的别名,或者换句话说,ref
是 ia
的别名。只是代码的语法糖。
这种情况下的编译器根本不需要做太多,只需跟踪代码何时包含ref
,将其替换为ia
。
C++ 标准未指定编译器应如何实现引用。很多人认为它们只是别名,但实际上,在幕后它们只是作为 const
指针实现的。
C++ 引用在底层是 const
指针。所以:
int ia = 10;
int& ref = ia;
ref++; // ia is 11 now
可能会被编译器转换为:
int ia = 10;
int* const ref = ia;
(*ref)++; // ia is 11 now
它们需要初始化,因为常量必须被初始化。