一个相当理论的问题......为什么常量引用的行为与常量指针的行为不同,我实际上可以更改它们指向的对象?它们看起来像是另一个简单的变量声明。我为什么要用它们?这是我运行的一个简短示例,它编译并运行时没有错误:
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;
}
答案 0 :(得分:76)
最清晰的答案。 的 Does “X& const x” make any sense? 强>
不,这是无稽之谈
要了解上述声明的含义,请从右向左阅读: “x是对X的const引用”。但这是多余的 - 参考 永远都是const,从某种意义上说,你永远不能重新引用一个引用 使它引用不同的对象。决不。有没有 常量。
换句话说,“X&amp; const x“在功能上等同于”X&amp; X”。 因为你通过在&amp;之后添加const来获得任何东西,你 不应该添加它:它会混淆人们 - 常量会产生一些 人们认为X是常数,就好像你曾说过“const X&amp; ×”。
答案 1 :(得分:47)
声明icr=y;
不会使引用引用y
;它会将y
的值分配给icr
引用的变量i
。
引用本质上是const
,即您无法更改它们所引用的内容。 “const
引用”实际上是“对const
的引用”,即您无法更改它们引用的对象的值。它们虽然声明为const int&
或int const&
而非int& const
。
答案 2 :(得分:25)
什么是常量引用(不是对常量的引用)
常量引用实际上是引用常量。
常量引用/对常量的引用表示为:
int const &i = j; //or Alternatively
const int &i = j;
i = 1; //Compilation Error
它基本上意味着,您无法修改引用引用的类型对象的值
例如:
尝试通过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;
不更改引用,指定引用引用的类型的值。 不能引用任何其他变量而不是它们在初始化时绑定的变量。
首先声明将值y
分配到i
第二个声明将值99
分配到i
答案 3 :(得分:3)
通过“常量引用”我猜你真的是指“引用常量数据”。另一方面,指针可以是常量指针(指针本身是常量,而不是它指向的数据),指向常量数据的指针,或两者。
答案 4 :(得分:3)
此代码格式不正确:
int&const icr=i;
参考:C ++ 17 [dcl.ref] / 1:
Cv限定的引用格式不正确,除非引入了cv限定符 通过使用 typedef-name 或 decltype-specifier ,在这种情况下,cv限定符将被忽略。
在所有C ++标准化版本中都存在此规则。因为代码格式错误:
编译器应拒绝该程序;如果没有,则可执行文件的行为是完全不确定的。
NB:不确定其他答案中没有哪一个...没有人可以访问编译器吗?
答案 5 :(得分:2)
正如在另一个答案中提到的那样,引用本质上是const。
int &ref = obj;
一旦使用对象初始化了引用,就无法将该引用与其引用的对象解除绑定。参考就像别名一样。
在声明const
引用时,仅是引用了const对象的引用。
const int &ref = obj;
上面的声明性语句(如const
和int
)确定了引用将引用的对象的可用功能。更清楚地说,我想向您展示与pointer
参考相同的const
;
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
答案 6 :(得分:-1)
首先,我认为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