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 * p
或type 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的常量指针的引用。
结论:在你的问题中,两者完全相同。