C + + : const 引用,之前与之后的类型说明符

下面这些论点的区别是什么:

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

还有

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

? 我没有看到这个案子包含在副职常见问题解答中。

100714 次浏览

两者都有效,而 给你就是编写它的人的解释。
引用他的话:

为什么? 当我发明“ const”的时候 (最初命名为“ readonly”,并有一个 相应的「只写」) ,我容许 它去之前或之后的类型 因为我可以不用 模棱两可。

尽管它们是一样的,但为了保持与解析 C 和 C + + 声明的 右-左规则的一致性,最好编写 Fred const &arg

还可以参考 这个,了解关于声明、限定符和声明器的更多信息。

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

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

这是一个样式问题,但我更喜欢使用 const作为后缀,因为它可以一致地应用,包括 Const 成员函数 const 成员函数

引用与指针的工作方式不同: 对于指针,可以有“ const 指针”(type * const p)和“ const 指针”(const type * ptype const * p)。

但是对于引用你没有这个: 一个引用总是引用同一个对象; 在这个意义上,你可以认为“引用”是“常量引用”(就像你可以有“常量指针”一样)。

因此类似“ type & const ref”的东西是不合法的。只能有“ reference to type”(type &ref)和“ reference to Constant type”(const type &reftype const &ref; 两者完全等价)。

最后一件事: 即使 const type在英语中听起来更正确,编写 type const允许更系统地理解“从右到左”的声明: int const & ref可以被读成有“ ref 是对一个常量 int 的引用”。或者更复杂的例子: int const * const & ref,ref 是对指向常量 int 的常量指针的引用。

结论: 在你的问题中,两者完全等价。

行为

const T&T const&之间没有语义上的区别; 语言将它们视为同一种类型。(同样的情况也适用于 const T*T const*。)

作为一种风格

关于你应该更喜欢哪种风格,但是,我不同意其他很多答案,更喜欢 const T&(和 const T*) :

  • const T&是 Stroustrup 的 C++程式语言书中使用的风格。
  • const T&是 C + + 标准本身使用的样式。
  • const T*是 K & R 的 C 程序设计语言书中使用的风格。
  • const T*是 C 标准中使用的样式。
  • 基于以上因素,我认为 const T&/const T*T const&/T const*具有更大的惯性。在我所看到的所有 C + + 和 C 代码中,const T&/const T*在经验上似乎比 T const&/T const*更常见。我认为遵循常规实践比教条地遵循从右到左的解析规则更具可读性。
  • 对于 T const*,似乎更容易把 *错当成 T* const(特别是当人们不习惯它的时候)。相比之下,const* T不是合法的语法。

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

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