【问题标题】:How is this C++ Reference Initialization Legal?这个 C++ 参考初始化如何合法?
【发布时间】:2017-11-26 04:20:59
【问题描述】:

我目前正在阅读 c++ Primer,在其中一个练习中,它显示了 2 种类型的引用初始化,一种是 const,一种不是,在一种 const 中,引用指向 0.. 我认为引用只能指向对象!!

   int i = -1, &r = 0;         // illegal, r must refer to an object.

   const int i = -1, &r = 0;   // legal.

所以第一个,int变量i是-1。然后 int 引用 r 指的是 0 即 无效,明白了

现在在第二个中,const int i = -1,然后 const reference r = 0.. 怎么样?

我知道引用不能是 const,const 是引用所指的内容,并且书上说 const 引用可以引用 const 和非 const 对象(相同类型)。这仍然不能解释为什么它可以指向 0,它根本不是一个对象..

我不确定第二个语句是如何有效的,请有人解释一下!

【问题讨论】:

  • 你知道右值和左值这两个术语吗?这些决定了允许绑定到哪些引用(连同类型)。
  • @NirFriedman 问这个问题时,我没有,但是当它得到回答时,我用谷歌搜索了它们,现在我做了......谢谢!

标签: c++ variables reference constants


【解决方案1】:

const int &r = 0;

使用值 0 创建一个临时对象,然后将r 绑定到该对象。这是允许的,因为允许 const 引用绑定到右值。它也适用于右值引用:

int&& r = 0;  // ok

但是,它不适用于int&,因为int& 变量只能绑定到左值。

请注意,引用绑定到的临时对象将一直存在,直到引用超出范围。见https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

【讨论】:

  • 好的,所以 const 引用可以绑定到任何可以转换为 const 引用的东西,但是 int 引用只能与 int、period、? 绑定
  • @iMarioOfficial 它可以用作int& 的初始化器,该对象具有到int& 的转换运算符。底线是必须有可能获得用于初始化的左值。
  • 哦,好的,我刚刚阅读了左值和右值,现在我明白了,谢谢!
  • 这个答案将通过参考参考生命周期延长得到改进;为什么这有点安全。
【解决方案2】:

C++ 特别允许将右值绑定到 const 左值引用,因此这完全符合标准:

const int &r = 0;

Reference

  • 右值可用于初始化 const 左值引用,在这种情况下,右值标识的对象的生命周期会延长,直到引用范围结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多