【问题标题】:Proper grammar for const referenceconst 引用的正确语法
【发布时间】:2018-05-10 01:08:15
【问题描述】:

我看到一些类似的代码:

Foo const& foo = val; // (A)
const Foo& foo = val; // (B)

只是const的位置不同。

虽然两者都可以正常工作,但我只想知道正确的语法。

我从R->L读到如下。

(A) foo 是 const 对类型 Foo 的引用 - 不确定 val 是否是 const
(B) foo 是对const 的引用类型Foo - 意思是valconst

鉴于引用不是对象,从技术上讲,所有引用都是const(它们不能引用另一个对象),

语法观点,(A) Foo const& foo = val; 是否被视为“令人困惑”的定义?

只需使用以下内容:

const Foo& foo = val; // referring to const Foo
Foo& foo = val;       // referring to non-const Foo

【问题讨论】:

  • 由于从语言的角度来看它们是相同的,所以关于使用哪一个的问题变得基于意见。

标签: c++ reference language-lawyer


【解决方案1】:

const 适用于其左侧的东西,除非那里什么都没有,否则它适用于其右侧的东西。

这两个语句相同

Foo const& foo = val; // (A)
const Foo& foo = val; // (B)

它们的意思是一样的:

foo 是对const Foo 对象的非const (1) 引用,并且正在初始化为对名为val 的对象的引用。

(1):根据定义,引用一旦初始化就不能更改,因此const 与非const 并不真正适用于引用本身,因为它是隐含地const。但是const 确实适用于被引用的东西。

【讨论】:

    【解决方案2】:
    Foo const& foo = val; // (A)
    const Foo& foo = val; // (B)
    

    两者的定义相同,只是风格问题: 引用 const 对象。

    这会有所不同:

    const Foo* fooC = nullptr; // (C)
    Foo* const fooD = nullptr; // (D)
    

    您不能重新分配fooD,但可以重新分配fooCfooC 指向的对象不能通过fooC 修改。 fooD指向的对象可以通过fooD修改。

    【讨论】:

    • 那些不是类似物。 Foo const& foo 的模拟是 Foo const* ptrFoo *const ptr 将对应于 Foo &const ptr,这是不允许的。
    • @rici:用指针替换引用,我没有说 (D) 与 (A) 或 (B) 相同((C) 将是)。我只是想展示另一个放置const 的地方。由于Foo& const foo 无效,我用指针显示它。
    • reference to const object - 准确地说是对对象的 const 引用。
    【解决方案3】:

    它们在语法上是相同的。和

    我从R->L读到如下。

    (A) foo 是 const 对类型 Foo 的引用

    我认为您没有正确阅读它。应该是这样的

    Foo const &
    Foo/const/reference to
    

    那么你应该得到“对 const Foo` 的引用。所以当从 R->L 读取时,(A) 更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-31
      • 2016-02-25
      • 2023-03-03
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多