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

eis*_*baw 132 c++ const reference

参数之间有什么区别:

int foo1(const Fred &arg) {
...
}
Run Code Online (Sandbox Code Playgroud)

int foo2(Fred const &arg) {
...
}
Run Code Online (Sandbox Code Playgroud)

?我没有看到parashift FAQ中涉及的这个案例.

jam*_*lin 119

行为

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*凭经验方式似乎更常见的是我比T const&/ T const*在所有的C++和C代码,我见过的.我认为遵循常规做法比通过教条地遵守从右到左的解析规则更具可读性.
  • 有了T const*,它似乎更容易放错地方的*作为T* const(特别是如果人们不是因为习惯了).相比之下,const* T不是合法的语法.

从右到左的解析规则怎么样?

关于人们似乎喜欢使用的整个从右到左解析的论点:正如我在对另一个答案的评论中提到的那样,const T&从右到左也是如此.它是对T常数的引用."T"和"常数"各自可以作为形容词或名词.(此外,读取T const*从右到左可以是不明确的,因为它可能被错误地解释为"指针常数 T",而不是称为"指针恒定T").

  • +1,同意.当读取代码时,如果行以const开头,则更容易发现const.实际上只有在手动解析毛发类型声明时才需要左右规则.为什么不针对最常见的情况进行优化?此外,恕我直言,如果您编写类型声明,所以你需要手动运行FSM,你做错了. (3认同)
  • -1.无论你的结论多么合理以及我个人同意他们多少,他们都没有直接回答问题*.这使得对一个简单问题的第二大答案看起来像一个关于一些凌乱的水下机器的偏离主题的胡言乱语,没有结论,没有直接答案 - 没有.当你添加一个简单的清晰摘要时,你会得到我的upvote,声明"**不,两种语法之间没有语义差异**,但有一些样式方面的考虑因素如下......".而且只有那些子弹. (2认同)

Sea*_*ett 107

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

Fred& const意味着引用本身是不可变的,这是多余的 ; 与打交道时const的指针Fred const*Fred* const是有效的,但是不同的.

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


Chu*_*dad 13

虽然它们是同一个,但为了保持与解析C和C++声明的RIGHT-LEFT规则的一致性,最好写一下Fred const &arg

另请参阅此内容以更好地理解声明,限定符和声明符.

  • IMO`const T&`也从右到左读得很好; 它是对T常数的引用.`T`和`constant`每个都可以作为形容词或名词. (4认同)

Def*_*ult 7

两者都有效,这里是编写它的人的解释.
引用他:

为什么?当我发明"const"(最初命名为"readonly"并且具有相应的"writeonly")时,我允许它在类型之前或之后进行,因为我可以毫不含糊地这样做.