const参考参数


73

以下声明之间有区别吗?

void somefunc(const Person &p);
void somefunc(Person const &p);

8
您应注意,该引用与以下问题无关:“ const Person p”也等效于“ Person const p”。
Evan Teran

Answers:


91

没有什么区别const绑定到类型的左侧...除非它是声明的第一部分,在这种情况下,它绑定到右侧。

请参阅:https//isocpp.org/wiki/faq/const-correctness#const-ref-alt

就个人而言,我认为它const T &x读起来更好。根据,Bjarne的也喜欢放const第一。特别是因为该关键字本来会被调用readonly并且readonly int x读起来更好:-P。


1
虽然我会说第一个比较普遍。
rlbond

@rlbond:更常见取决于上下文。在某些地方,我看到第一个更常见,在其他地方,我看到第二个更常见。这一切都取决于。
马丁·约克2009年

6
当然,在处理间接寻址时,第二个更为一致。例如:int const * const x; (一切都剩下了)
Evan Teran 2009年

关于您的语句的问题“常量绑定到其左侧的类型...绑定到右侧”。这个左/右绑定规则是C ++标准描述的正式概念吗?我试图理解C ++标准,该标准有点难以阅读,找不到描述这种概念的任何东西。(我只是在寻求理解C ++标准的同时寻求帮助)
JavaMan

@JavaMan:不幸的是,它并不像一段话那么简单。在标准的后面,有一个“语法摘要”。在语法级别指定语言。其中包括指定cv-qualifiers有效的上下文。
埃文·特兰

47

就在这里!第一个更具可读性:)


我猜你想说“对那些阅读LTR的人更易读!” :)我听说东部一些人读了他们的文字RTL。
Johannes Schaub-litb

2
没有!第二!(的确-您必须从右到左阅读定义:Person const * volatile * p; // p是指向Person的cont指针的volatile指针。)
MSalters,2009年

1
@litb ::我读了其中一种RTL语言,这并不难,因为它是我的母语:D
AraK

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。但是,真正的问题是应该使用哪个。

阅读本文的其余部分以获取更多信息。但从本质上讲,它说它们是等效的,您可以根据需要使用其中之一。但是,您应该选择一个并坚持下去,以免将来造成混乱。


4
在编写新代码时,我将添加,选择一个并坚持使用,但是在修改现有代码时,请坚持使用现有代码的方式。
罗布K

4

这真的是一个品味问题。

如果从右到左Person const & x读取,则“ ”表示“ x是对常量Person的引用”。

听起来比“const Person & x ”,后者将是“ x是对Person的引用,它是恒定的”。

因此,如果熟悉变量声明的从右到左读取方向,则可能更喜欢第一个。


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可能是最好的选择!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.