C ++:const引用,在types说明符之前

在以下的论点之间有什么区别?

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

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

? 我没有看到这个案例涵盖在parashift常见问题。

与const相比,与const 没有区别 ,因此它们都表示对不可变Fred实例的引用。

Fred& const将意味着参考本身是不变的,这是多余的 ; 当处理const指针时 , Fred const*Fred* const是有效的,但不同。

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

行为

const T&T const& (在const T*T const* )没有语义上的区别。 该语言将其视为同一types。

作为一个风格问题

关于哪个你应该更喜欢的风格,但是,我会反对很多其他的答案,并更喜欢const T& (和const T* ):

  • const T&是Stroustrup's The C ++编程语言手册中使用的样式。
  • const T&是C ++标准自身使用的样式。
  • const T*是K&R's The C Programming Language书中使用的风格。
  • const T*是C标准中使用的样式。
  • 由于上述因素,我认为const T& / const T*T const& T const*有更多的惯性。 const T& / const T*在我看来,在所有的C ++和C代码中,我经验地看起来比T const& T const*更为常见。 我认为遵循常规做法比教条式地坚持从右到左的parsing规则更可读。
  • 使用T const* ,将*错位为T* const似乎更容易(尤其是在人们不习惯的情况下)。 相反, const* T不是合法的语法。

那么从右到左的parsing规则呢?

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

尽pipe它们是相同的,但为了保持与parsingC和C ++声明的RIGHT-LEFT规则的一致性,最好编写Fred const &arg

也可以参考这个来获得更多关于声明,限定词和声明符的理解。

没有区别, 两者在语法和语义上都是相同的。

两者都有效, 这里是写这个的人的解释。
引用他的话:

为什么? 当我发明“const”(最初名为“readonly”,并有相应的“writeonly”)时,我允许它在该types之前或之后进行,因为我可以毫不含糊地这样做。

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

但是你没有这个引用:引用将总是指向同一个对象; 在这个意义上,你可以认为'引用'是'常量引用'(你可以有'const指针')。

因此,像“types和常量参考”是不合法的。 你只能有'引用types'( type &ref )和'引用常量types'( const type &ref或者type const &ref ;都完全等价)。

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

结论:在你的问题中,两者完全相同。