C : const 引用,在类型说明符之前 vs 之后

新手上路,请多包涵

中的论点有什么区别:

 int foo1(const Fred &arg) {
...
}

int foo2(Fred const &arg) {
...
}

?我没有在 parashift FAQ 中看到这个案例。

原文由 eisbaw 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
2 个回答

没有区别,因为 const 相对于 & 是从右到左读取的,因此两者都表示对不可变 Fred 实例的引用。

Fred& const 意味着引用本身是不可变的,这是 多余 的;在处理 const 指针 时, Fred const*Fred* const 都有效但不同。

这是风格问题,但我更喜欢使用 const 作为后缀,因为它可以一致地应用,包括 const member functions

原文由 Sean Fausett 发布,翻译遵循 CC BY-SA 3.0 许可协议

行为

const T&T const& 之间没有语义差异;语言将它们视为同一类型。 (同样的事情适用于 const T*T const* 。)

作为风格问题

但是,关于您应该在风格上更喜欢哪个,我会反对许多其他答案,而是更喜欢 const T& (和 const T* ):

  • const T& 是 Stroustrup 的 The C++ Programming Language 一书中使用的风格。
  • const T& 是 C++ 标准本身使用的样式。
  • const T* 是 K&R 的 The C Programming Language 一书中使用的风格。
  • const T* 是 C 标准中使用的样式。
  • 由于上述因素,我认为 const T& / const T*T const& / T const* 有更大的惯性。 const T& / const T* empirically seem way more common to me than T const& / T const* in all of the C++ and C code that I’ve见过。我认为遵循常见做法比教条地坚持从右到左的解析规则更具可读性。
  • 使用 T const* ,似乎更容易将 * 错位为 T* const (特别是如果人们不习惯它)。相反, const* T 不是合法的语法。

那么从右到左的解析规则呢?

关于人们似乎喜欢使用的整个从右到左的解析参数:正如我在对另一个答案的评论中提到的那样, const T& 从右到左也读得很好。它是对 T 常数的引用。 “T”和“常数”都可以用作形容词或名词。 (此外,阅读 T const* 从右到左可能会产生歧义,因为它可能被错误地解释为“ 指向 T 的指针常量”而不是“ 指向 常量 T 的指针”。)

原文由 jamesdlin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题