it-swarm.cn

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

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

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

最清楚的答案。“X&const x”有意义吗?

不,这是无稽之谈

要找出上述声明的含义,请从右到左阅读:“x是对X的const引用”。但这是多余的 - 引用始终是const,在某种意义上,您永远不能重新引用引用以使其引用不同的对象。决不。有或没有const。

换句话说,“X&const x”在功能上等同于“X&x”。因为你在&之后添加const没有任何收获,你不应该添加它:它会让人迷惑 - const会让一些人认为X是const,好像你说的是“const X&x”。

75
Bat0u89

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

引用本质上是const,即你无法改变它们所指的内容。有'const references'实际上是'const'的引用,也就是说你不能改变它们引用的对象的值。它们被声明为const int&int const&而不是int& const

46
mattnewport

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

常量引用/对常量的引用表示为:

int const &i = j; //or Alternatively
const int &i = j;
i = 1;            //Compilation Error

它基本上意味着,您无法修改引用引用的类型对象的值。
例如:
尝试通过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
第二个陈述 分配 99i

25
Alok Save

此代码格式错误:

int&const icr=i;

参考:C++ 17 [dcl.ref]/1:

除非通过使用 typedef-name decltype-specifier 引入cv限定符,否则Cv限定引用的格式不正确,在这种情况下,cv限定符将被忽略。

此规则已存在于C++的所有标准化版本中。因为代码格式不正确:

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

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

注意:不确定其他答案是如何提到的......没人能访问编译器?

3
M.M

通过“恒定参考”,我猜你真的是指“引用恒定数据”。另一方面,指针可以是常量指针(指针本身是常量,而不是它指向的数据),指向常量数据的指针,或两者。

3
Poodlehat

正如它在另一个答案中所提到的,引用本身就是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
2
Ozan Yurtsever