以下声明之间是否存在差异?
void somefunc(const Person &p);
void somefunc(Person const &p);
答案 0 :(得分:91)
没有区别。 const
绑定到其左侧的类型...除非它是声明的第一部分,在这种情况下它绑定到右侧。
请参阅:https://isocpp.org/wiki/faq/const-correctness#const-ref-alt
就个人而言,我发现const T &x
读得更好。根据{{3}},Bjarne也更喜欢将const
放在首位。特别是因为关键字最初将被称为readonly
,readonly int x
读取更好:-P。
答案 1 :(得分:47)
是的! 第一个更具可读性:)
答案 2 :(得分:11)
请参阅 http://www.parashift.com/c++-faq-lite/const-correctness.html
(请参阅新链接:https://isocpp.org/wiki/faq/const-correctness#const-ref-alt)
具体为18.6至18.8。
[18.6] “const Fred& x”是什么意思?
这意味着x别名为Fred对象,但x不能用于更改Fred对象。
[18.7]“Fred& const x”是否有意义?
不,这是无稽之谈。
[18.8]“Fred const& x”是什么意思?
Fred const& x在功能上 相当于const Fred& X。然而, 真正的问题应该是什么 使用
阅读文章的其余部分以获取更多信息。但实质上,它说它们是等价的,你可以根据自己的需要使用其中任何一个。但是,你应该选择一个并坚持下去,以避免将来混淆。
答案 3 :(得分:4)
这真的是一种品味问题。
如果从右到左阅读,“Person const & x
”读取“x是对常数人的引用。”
这听起来比“const Person & x
”好,这就是“x是对Person的引用,它是常量。”
因此,如果一个人熟悉变量声明从右到左的阅读方向,那么人们可能更喜欢第一个。
答案 4 :(得分:4)
两者都是一样的。
const Person& x目前是最受欢迎的,因为英语将形容词放在名词之前,这使得它“更像英语。”
替代形式,Person const& x,被认为是一种不那么惯用的形式。他们的论点是,这个表单总是可以从右到左解析,“x是对const Person的引用”。争论的焦点是解析的清晰度比惯用结构更重要。
不幸的是,对于那些人来说,他们的形式并不能解决所有问题一旦你开始看到数组和函数指针以及其他异乎寻常的形式,规则就会开始崩溃。 char * str [10]不能以从右到左的形式写入,因为数组必须位于右侧。 void(* signal(int,void(* fp)(int)))(int)让右边的人在痛苦中畏缩。
只有规则才能理解所有类型,顺时针螺旋规则:http://c-faq.com/decl/spiral.anderson.html
通常,一旦有人看到顺时针螺旋,所有希望清晰的解析规则就会消失。然后大多数人接受const Person& x可能是最好的方式!