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

时间:2011-09-14 17:55:12

标签: c++ reference constants const

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

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; 
}

7 个答案:

答案 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;

上面的声明性语句(如constint)确定了引用将引用的对象的可用功能。更清楚地说,我想向您展示与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