【问题标题】:What would be a reason to make all the reference parameters const? [closed]将所有参考参数设为 const 的原因是什么? [关闭]
【发布时间】:2014-07-09 17:06:16
【问题描述】:

是否有充分的理由将所有或大部分引用参数设为 const?

我正在阅读 Google C++ 样式指南,但我不明白为什么“所有通过引用传递的参数都必须标记为 const。” (见here

  1. 谁能为此提供一些理由?
  2. 根据本指南,当方法/函数应该更改对象时,我应该只使用指针吗?

我知道有很多人批评本指南,例如article。我正在寻找一个可以为上述“必须”提供合乎逻辑的论据的答案,而不仅仅是争辩说谷歌是错误的。

【问题讨论】:

  • 他们为此提供了自己的理由,即遵循他们的约定的人将为作为引用传入的变量与作为指针传入的变量分配不同的语义。这是他们的风格/约定指南,如果您不同意它,那很好,但是这个问题会带来几乎任意的答案,这些答案将包含在许多不同的编码约定指南中。
  • 套用奥斯卡·王尔德的话说,“[风格] 是一种令人难以忍受的丑陋形式,我们必须每六个月改变一次”
  • 另外,通过引用传递一些东西可以更快(不需要变量/对象的副本),所以每次优化,有时使用引用可能是一个好主意(因此,当你仍然不想修改原始值,使用const 是合乎逻辑的)。当然,这使得判断他们是使用它来更改输入变量/对象还是仅仅优化有点令人困惑。在我看来,Const-references 可以解决这个问题。
  • 为什么我的问题被否决了?我真的不明白一个概念,我寻求帮助。它不是重复的,我认为我的表述是正确的,因为“他们文件中的理由”对我来说不够清楚。如果有人投反对票,请解释原因。
  • 我没有投反对票,但这是一个编程问答,而不是 Google 内部政策问答。在 C++ 中,我们有 std::swapstd::getlinestd::regex_search 以及许多其他修改引用参数的函数。

标签: c++ pointers reference coding-style constants


【解决方案1】:

似乎他们认为非const 引用允许可变引用语义,但在代码中并不明显。使用指针时,您必须显式执行间接寻址(使用*),这表明您正在使用引用语义。

我不会说这是一个特别好的论点。相反,我建议尽可能避免使用可变引用语义(无论是引用还是指针)。值语义更容易推理。此外,非const 引用参数传统上用于输出参数,当单个返回类型不够时。如今,如果我们想要多个输出,我们可以轻松地返回 std::tuple

我会说非const 引用和指针参数在现代 C++ 代码中都没有太多的位置。

【讨论】:

    【解决方案2】:

    只是为了澄清输入和输出。输入值应作为 const 引用(因为它们是纯输入,它们不应更改参数的值)或按值获取。输出应该是指针。每当您看到指针时,它就是输出(或输入输出)。每当您看到引用时,它就是一个输入。

    【讨论】:

      【解决方案3】:

      据我所知,不允许非const 引用的原因是它可以很容易地判断一个参数何时可能被修改:如果你传入一个指向它的指针,那么它可能会被修改,但如果你通过引用传递,它肯定不会。

      foo(bar, &baz); // baz may be modified, bar will not be modified
      

      如果foo 被允许通过非const 引用获取参数,那么即使参数的地址没有在任何地方显式获取,它也可能会修改参数。

      【讨论】:

        【解决方案4】:
        1. 在调用站点明确表示可以修改参数。
        2. 是的。

        这实际上并不是一个坏主意,我曾多次对函数更改作为参数传递的变量感到惊讶,而我一见钟情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-11
          • 2020-12-13
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 2019-12-28
          • 2010-11-08
          相关资源
          最近更新 更多