2014-10-03 92 views
3

谈论一个函数参数,例如:第二个const在“const int const&someval”中做什么?

void doSomething(const int const &someVal); 

据我了解,拳头常量表示该值将不会被函数改变,并且&表示该值应该传递参考。但是第二个'const'是做什么的?

+6

它刺激,混淆,并导致[编译器诊断](http://ideone.com/ZYakRQ)。 – 2014-10-03 18:16:13

+3

使程序不合格吗? – 0x499602D2 2014-10-03 18:16:15

+1

它握着蜡烛。 – jrok 2014-10-03 18:17:22

回答

2

根据C++标准(7.1.6.1的CV-限定符)

1有两个cv修饰符,常量和挥发性。 每个cv限定符 在cvqualifier seq中应至多出现一次。如果cv限定符 出现在decl-specifier-seq中,则 声明的init声明符列表不应为空。 [注意:3.9.3和8.3.5描述了如何使用 cv-qualifiers影响对象和函数类型。 - 注意] 冗余cv资格被忽略。 [注:例如,这些可以通过typedefs.,注完介绍]

所以这个声明

void doSomething(const int const &someVal); 

有被简单地忽略冗余const修饰。

如果someVal将被声明为对const指针的引用,则第二个const限定符将有意义。例如,

void doSomething(const int * const &someVal); 
+0

它不仅被忽略。 'const int const'由7.1.6 [dcl.type]/p2不合格,第一个要点:“'const'可以与任何类型说明符组合_except本身_”。 (强调增加)。 – 2014-10-03 21:16:30

0

这两个应该工作:

void doSomething(const int &someVal); 

void doSomething(int const &someVal); 

使用第二常量不添加任何功能和额外的一个应该被删除。尽管为了清晰起见,将常量保留在左边是一个很好的习惯,因为它更好。

相关问题