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

C++ 什么是常数引用?(不是对常数的引用),c++,reference,constants,C++,Reference,Constants,一个相当理论化的问题…为什么常量引用的行为方式与常量指针不同,而我实际上可以更改它们所指向的对象?它们看起来真的像是另一个简单的变量声明。我为什么要用它们?这是我运行的一个简短示例,编译和运行时没有错误: 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

一个相当理论化的问题…为什么常量引用的行为方式与常量指针不同,而我实际上可以更改它们所指向的对象?它们看起来真的像是另一个简单的变量声明。我为什么要用它们?这是我运行的一个简短示例,编译和运行时没有错误:

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; 
}
int main(){
int i=0;
int y=1;
int&const icr=i;
icr=y;//可以更改它指向的对象,使其不像常量指针。。。
icr=99;//可以指定另一个值,但该值未指定给y。。。
int x=9;
icr=x;

cout语句
icr=y;
不使引用引用
y
;它将
y
的值赋给
icr
引用的变量,
i


引用本质上是
const
,也就是说,您不能更改它们引用的内容。有“
const
引用”实际上是“对
const
的引用”,也就是说,您不能更改它们引用的对象的值。它们被声明为
const int&
int const&
,而不是
int&cons>t
但是。

什么是常数引用(不是常数引用)
常量引用实际上是对常量的引用

常数引用/常数引用表示为:

int const &i = j; //or Alternatively
const int &i = j;
i = 1;            //Compilation Error
这基本上意味着,您不能修改引用的类型对象的值。
例如:
试图通过常量引用修改变量
j
的值(赋值
1
),
i
将导致错误:

只读引用“i”的赋值


不更改引用,它将指定引用所引用类型的值。 除了在初始化时绑定到的变量外,不能使引用引用引用任何其他变量

第一条语句
y
值赋值给
i

第二个语句通过“常量引用”将
99
值赋值给
i

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

最清晰的答案。

不,这是胡说八道

要了解上述声明的含义,请从右到左阅读: “x是对x的常量引用”,但这是多余的引用 始终是常量,从某种意义上说,您永远无法重置引用 使它引用不同的对象。永远不要。有或没有 康斯特

换句话说,“X&const X”在功能上等同于“X&X”。 由于在&之后添加const没有任何好处,因此 不应该加上它:它会让人困惑——const会制造一些麻烦 人们认为X是常数,就像你说的“常数X&X”


首先,我认为
int&const-icr=I;
只是
int&icr=I
,修饰符“const”没有任何意义(它只是意味着不能使引用引用引用其他变量)

其次,常量引用只是意味着不能通过引用来更改变量的值

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
第三,常量引用可以绑定正确的值。编译器将创建一个临时变量来绑定引用

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
float x=10;
常数int&y=x;
常数int&z=y+10;

cout此代码格式不正确:

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

除非引入Cv限定符,否则Cv限定引用的格式不正确 通过使用typedef名称或decltype说明符,在这种情况下,cv限定符将被忽略

此规则已出现在C++的所有标准化版本中,因为代码不正确:

int&const icr=i;
  • 你不应该使用它,而且
  • 没有相关的行为
编译器应该拒绝该程序;如果不拒绝,则可执行文件的行为完全未定义


注:不确定其他答案中怎么没有提到这一点……没有人能访问编译器?

正如其他答案中提到的,引用本身就是常量

int &ref = obj;
一旦用对象初始化了引用,就无法将此引用与其引用的对象解除绑定。引用的工作原理与别名类似

当您声明一个
const
引用时,它只不过是一个引用const对象的引用

const int &ref = obj;
上面的陈述句,如
const
int
确定了引用将引用的对象的可用特征

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

查看
i
之前和之后的
icr=y;
。请查看最后的x值。它是9。因为引用i的icr已更改为9。这不会编译!!
int&const icr=i;
是错误的。示例代码实际上引用了一个常量引用(
int&const icr=i;
)不是对常数的引用。我假设海报不清楚,因为常量在代码中的位置。所以对常量的引用也可以被视为对常量的常量引用?这很有意义。@Dasaru:是的,可以,但对非常量的引用也可以被视为常量引用