在下面两个函数参数之间有什么区别:
int foo1(const Fred &arg) {
...
}
并且
int foo2(Fred const &arg) {
...
}
我在parashift的常见问题解答中没有看到这种情况被覆盖。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"和"constant"都可以作为形容词或名词。 (此外,从右到左阅读T const*
可能会产生歧义,因为它可能被错误地解释为“指向T的指针常量”而不是“指向常量T的指针”。)
const T&
读起来更好的原因是:
1- 我们从左到右阅读代码。并且
2- 当描述一个新概念时,我们从更一般的概念开始到更具体的概念。
在这里,const
关键字更为通用,因为它将变量空间分成两个类别,而类型说明符将其分成多个类别。 - pooya13T const*
就不会有歧义。 - Dexterstd::is_const<const T&>::value
为 false
有什么意义呢? - abyss.7const T
的引用;该引用是可变的。 - Sean FausettT& const
的概念是否多余?这确实是一个非常有价值的 is_const
问题,我也想知道答案。 - Violet Giraffeconst
限定符:“引用类型不能在顶层处进行cv限定;在声明中没有语法规定,如果在typedef名称、decltype说明符或类型模板参数中添加了限定符,则会被忽略。”(参见cppreference.com) - Sean Fausett两种方式都可以,这里是它的创作者解释。
他说:
为什么?当我发明“const”(最初被命名为“readonly”,并有相应的“writeonly”)时,我允许它在类型之前或之后出现,因为我可以这样做而不会产生歧义。
type * const p
)和“指向const”的指针(const type * p
或 type const * p
)。
但是对于引用,您没有这个选项:引用始终将引用同一对象;从这个意义上说,您可以将“引用”视为“const引用”(就像您可以有“const指针”一样)。
因此,“type & const ref”之类的内容是不合法的。您只能拥有“type的引用”(type &ref
)和“常量类型的引用”(const type &ref
或type const &ref
;两者完全等价)。
最后,即使在英语中,“const type”听起来更正确,编写“type const”可以让人更系统地理解声明的“从右到左”: int const & ref
可以被理解为“ref是一个指向常量int的引用”。或者更复杂的例子:int const * const & ref
,ref是一个指向常量指针的常量int的引用。
结论:在您的问题中,两者是完全相等的。
Fred const &arg
而不是Fred const& arg
?我更喜欢后者,因为const&
是一个单元,意思是 "constref",而名称arg
与所有类型说明符都用空格分开。 - Frankint const& ref
并不意味着“const引用”,而是“引用常量”。 - Cedric H.