什么是常数引用?(不是对常量的引用)

What is a constant reference? (not a reference to a constant)

本文关键字:引用 常量 常数 什么      更新时间:2023-10-16

为什么常量引用的行为与常量指针不同,这样我就可以实际改变它们指向的对象?它们看起来就像另一个普通的变量声明。我为什么要用它们?

这是我运行的一个简短的示例,编译和运行没有错误:

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;

不改变引用,它将引用所指向的类型的值赋给。除了初始化时绑定的变量之外,引用不能引用任何其他变量。

第一条语句赋值yi
第二个语句的值99赋值给i

这段代码格式错误:

int&const icr=i;
参考文献:c++ 17 [dcl.ref]/1:

限定cv的引用是病态的,除非引入了限定cv通过使用 typedefine -namedecltype-specifier,在这种情况下cv-限定符被忽略。

此规则在所有标准化的c++版本中都存在。因为代码格式错误:

  • 你不应该使用它,
  • 没有相关的行为。

编译器应该拒绝该程序;如果没有,则可执行文件的行为是完全未定义的。

NB:不知道为什么没有其他答案提到这个…没人能接触到编译器?

我猜你真正的意思是"对常量数据的引用"。另一方面,指针可以是常量指针(指针本身是常量,而不是它所指向的数据),指向常量数据的指针,或者两者兼而有之。

正如在另一个答案中提到的,引用本质上是const。

int &ref = obj;

一旦你用一个对象初始化了一个引用,你就不能解除这个引用和它所引用的对象的绑定。引用的作用就像别名。

当你声明const引用时,它只是一个指向const对象的引用。

const int &ref = obj;

上面的陈述句,如constint,正在确定对象的可用特性,该对象将被引用。为了更清楚,我想向您展示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