Bat*_*u89 62 c++ const 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 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;
}
Run Code Online (Sandbox Code Playgroud)
Bat*_*u89 80
最清楚的答案. "X&const x"有意义吗?
不,这是胡说八道
要找出上述声明的含义,请从右到左阅读:"x是对X的const引用".但这是多余的 - 引用始终是const,在某种意义上,您永远不能重新引用引用以使其引用不同的对象.决不.有或没有const.
换句话说,"X&const x"在功能上等同于"X&x".因为你在&之后添加const没有任何收获,你不应该添加它:它会让人迷惑 - const会让一些人认为X是const,好像你说过"const X&x".
mat*_*ort 50
该陈述icr=y;
未提及参考y
; 它将值赋给引用y
的变量icr
,i
.
参考文献本身就是const
,你无法改变他们所指的内容.有些" const
引用"实际上是"引用const
",即您无法更改它们引用的对象的值.他们被宣布const int&
或int const&
不是int& const
.
Alo*_*ave 25
什么是恒定的参考(不是恒定的引用)
一个恒定的参考实际上是参考一个常数.
常量引用/对常量的引用表示为:
int const &i = j; //or Alternatively
const int &i = j;
i = 1; //Compilation Error
Run Code Online (Sandbox Code Playgroud)
它基本上意味着,您无法修改引用引用的类型对象的值.
例如:
尝试通过const引用修改1
变量的值(赋值)将导致错误: j
i
指定只读参考'i'
icr=y; // Can change the object it is pointing to so it's not like a const pointer...
icr=99;
Run Code Online (Sandbox Code Playgroud)
不更改引用,它指定引用引用的类型的值.不能引用任何其他变量而不是它们在初始化时绑定的变量.
第一条语句指定的值y
到i
第二条语句指定的值99
来i
这段代码的格式不正确:
int&const icr=i;
Run Code Online (Sandbox Code Playgroud)
参考:C++17 [dcl.ref]/1:
Cv 限定引用的格式不正确,除非通过使用typedef-name或decltype-specifier引入 cv 限定符,在这种情况下,cv 限定符将被忽略。
该规则已存在于 C++ 的所有标准化版本中。因为代码格式不正确:
编译器应该拒绝该程序;如果没有,则可执行文件的行为完全未定义。
注意:不确定其他答案怎么没有提到这一点......没有人可以访问编译器?