什么是常数引用?(不是对常量的引用)
What is a constant reference? (not a reference to a constant)
为什么常量引用的行为与常量指针不同,这样我就可以实际改变它们指向的对象?它们看起来就像另一个普通的变量声明。我为什么要用它们?
这是我运行的一个简短的示例,编译和运行没有错误:
int main (){
int i=0;
int y=1;
int&const icr=i;
icr=y; // Can change the object it is pointing to so it's not like a const pointer...
icr=99; // Can assign another value but the value is not assigned to y...
int x=9;
icr=x;
cout<<"icr: "<<icr<<", y:"<<y<<endl;
}
最明确的答案。"X&Const x "有意义吗?
不,这是胡说八道
要了解上面的声明是什么意思,从右向左读:" x是对x的const引用"。但那是多余的——参考文献永远是const,也就是说永远不能重置引用使它指向不同的对象。从来没有。不管有没有const。
换句话说,"X&const x "在功能上等同于" x &x"。因为在& &之后添加const没有任何好处,所以不应该添加它:它会让人感到困惑——const会生成一些人们认为X是const,就好像你说"const X&x"。
语句icr=y;
不使引用指向y
;将y
的值赋给icr
所指的变量i
。
引用本质上是const
,也就是说你不能改变它们引用的内容。有一些"const
引用"实际上是"对const
的引用",也就是说你不能改变它们所引用的对象的值。它们被声明为const int&
或int const&
,而不是int& const
。
什么是常量引用(不是常量引用)
常量引用实际上是对常量的引用。
常量引用/对常量的引用用:
int const &i = j; //or Alternatively
const int &i = j;
i = 1; //Compilation Error
它的基本意思是,你不能修改Reference所指向的类型对象的值。
例如:
试图通过const引用修改变量j
的值(分配1
), i
将导致错误:
只读引用' i '的赋值
icr=y; // Can change the object it is pointing to so it's not like a const pointer...
icr=99;
不改变引用,它将引用所指向的类型的值赋给。除了初始化时绑定的变量之外,引用不能引用任何其他变量。
第一条语句给赋值y
给i
第二个语句将的值99
赋值给i
这段代码格式错误:
int&const icr=i;
参考文献:c++ 17 [dcl.ref]/1:
限定cv的引用是病态的,除非引入了限定cv通过使用 typedefine -name或decltype-specifier,在这种情况下cv-限定符被忽略。
此规则在所有标准化的c++版本中都存在。因为代码格式错误:
- 你不应该使用它,
- 没有相关的行为。
编译器应该拒绝该程序;如果没有,则可执行文件的行为是完全未定义的。
NB:不知道为什么没有其他答案提到这个…没人能接触到编译器?
我猜你真正的意思是"对常量数据的引用"。另一方面,指针可以是常量指针(指针本身是常量,而不是它所指向的数据),指向常量数据的指针,或者两者兼而有之。
正如在另一个答案中提到的,引用本质上是const。
int &ref = obj;
一旦你用一个对象初始化了一个引用,你就不能解除这个引用和它所引用的对象的绑定。引用的作用就像别名。
当你声明const
引用时,它只是一个指向const对象的引用。
const int &ref = obj;
上面的陈述句,如const
和int
,正在确定对象的可用特性,该对象将被引用。为了更清楚,我想向您展示const
引用的pointer
等效;
const int *const ptr = &obj;
所以上面这行代码在工作方式上相当于一个const
引用。另外,还有最后一点我想提一下;
引用只能用对象
初始化
当你这样做的时候,你会得到一个错误;
int &r = 0; // Error: a nonconst reference cannot be initialized to a literal
该规则有一个例外。如果引用声明为const,那么也可以用字面量初始化它;
const int &r = 0; // a valid approach
首先我认为int&const icr=i;
只是int& icr = i
,修饰符'const'没有意义(它只是意味着你不能使引用引用其他变量)。
const int x = 10;
// int& const y = x; // Compiler error here
第二,常量引用只是意味着你不能通过引用来改变变量的值。
const int x = 10;
const int& y = x;
//y = 20; // Compiler error here
第三,常量引用可以绑定右值。编译器将创建一个临时变量来绑定引用。
float x = 10;
const int& y = x;
const int& z = y + 10;
cout << (long long)&x << endl; //print 348791766212
cout << (long long)&y << endl; //print 348791766276
cout << (long long)&z << endl; //print 348791766340
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 为什么我可以通过引用修改常量返回
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 将常量指针引用绑定到非常量指针
- 通过常量引用传递参数的矩阵模板类
- 按值捕获引用时出现非常量
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么按值传递QStringView比引用常量更快?
- 通过引用常量函数调用另一个类的非常量函数
- 构造常量对象与引用常量对象
- 引用“常量value_type”时出错
- 为什么可以在 for 语句中重新分配引用常量
- 程序反馈:命名循环索引和引用常量数据
- 堆还是栈?在c++中函数调用中引用常量字符串时
- 为什么常量结构数组在按名称引用常量结构时不放在 .rodata 中?
- 为什么编译器允许在函数中发送对迭代器的引用,该函数引用常量迭代器