以下参数之间有什么区别:
int foo1(const Fred &arg) {
...
}
和
int foo2(Fred const &arg) {
...
}
? 我不认为这个案例在parashift FAQ中有所涉及。
答案 0 :(得分:112)
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*
更具惯性。在我见过的所有C ++和C代码中,const T&
/ const T*
在经验上似乎比T const&
/ T const*
更常见。我认为遵循常规做法比通过教条地遵守从右到左的解析规则更具可读性。T const*
,将*
错误地放置为T* const
似乎更容易(特别是如果人们不习惯它)。相反,const* T
不是合法语法。关于人们似乎喜欢使用的整个从右到左解析的论点:正如我在对另一个答案的评论中提到的那样,const T&
也从右到左阅读。它是对T常数的引用。 “T”和“常数”各自可以作为形容词或名词。 (另外,从右到左阅读T const*
可能不明确,因为它可能被错误地解释为“指针常量到 T”而不是“指针到常数T“。)
答案 1 :(得分:97)
No difference因为const是从右到左读取的,所以两者都表示对不可变Fred实例的引用。
Fred& const
意味着引用本身是不可变的,redundant;在处理const pointers时,Fred const*
和Fred* const
都有效但不同。
这是一种风格问题,但我更喜欢使用const
作为后缀,因为它可以一致地应用,包括const member functions。
答案 2 :(得分:13)
虽然它们是同一个,但为了保持与解析C和C ++声明的RIGHT-LEFT规则的一致性,最好写Fred const &arg
另请参阅this以了解有关声明,限定符和声明符的更多理解。
答案 3 :(得分:7)
两者都有效,here是写作者的解释 引用他:
为什么呢?当我发明“const” (最初名为“readonly”并且有一个 相应的“writeonly”),我允许 它在类型之前或之后去 因为我可以没有 歧义。
答案 4 :(得分:5)
答案 5 :(得分:3)
答案 6 :(得分:2)
引用与指针的工作方式不同:对于指针,您可以使用“常量指针”(type * const p
)和“指向const的指针”(const type * p
或type const * p
)。
但是你没有这个用于引用:引用总是引用同一个对象;从这个意义上说,你可以认为'引用'是'const引用'(就像你可以拥有'const指针'一样)。
因此像'type& const ref'不合法。您只能“引用类型”(type &ref
)和“引用常量类型”(const type &ref
或type const &ref
;两者完全相同。)
最后一件事:即使const type
在英语听起来更正确,写type const
也可以更系统地理解“从右到左”的声明:int const & ref
可以读取'参考是对常量int'的引用。或者更复杂的例子:int const * const & ref
,ref是对常量int的常量指针的引用。
结论:在你的问题中,两者完全相同。