2013-10-27 56 views
1

我在浏览网上一些代码,我看到这两声明字符串之间的区别,是什么宣称与常量字符串和字符串常量

const std::string strFoo = "MyFoo"; 

std::string const strBar = "MyBar"; 

我对const关键字的不同位置感到困惑。究竟是什么目的?

谢谢!

+5

没有。该语言特意允许基本类型的初始const在类型之前或之后,但仅限于该特定的decl形式。 'const char *'和'char const *'是另外一个例子。目的是声明上述变量的不可变状态。顺时针/螺旋规则的 – WhozCraig

回答

4

在这种情况下它使得没有区别

对于更复杂的声明它可能会有很大的不同。

您可以说const适用于左侧的内容,如果没有任何内容,则适用于右侧的内容。

例如使用上的指针const预选赛INT:

const int* ptr1;  // (1.) pointer to const int 
int const * ptr2;  // (2.) same as 1. 
int* const ptr3;  // (3.) const pointer to int 
const int* const ptr4; // (4.) const pointer to const int 
int const * const ptr4; // (5.) same as 4. 

有关如何阅读复杂的类型声明的详细信息SE这:C Right-Left Rule

+0

-1。这个规则破坏了优先顺序,所以它甚至不能解析类似'int a [4] [5]'的声明。它也过于复杂。改为使用右键规则:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html,它遵循优先顺序,而不会错误地假设“顺时针方向”。 – kotlomoy

+0

@kotlomoy如果你在螺旋中单次传递符号像'[] []',它就可以工作。但是看看你提供的链接,右边的规则确实看起来更直观(虽然它没有提到如何处理const限定符,但它太糟糕了)。我已经更新了我的答案。 – Snps

+0

+1版。 'const'限定符遵从优先顺序,所以左右规则运行良好。例如,'int const * const ptr4;' - 从'ptr4'解析到左边,我们得到“const指针指向const int”。有一个值得注意的丑陋例外 - 出于某种原因,它允许在这里像'const int * ptr1;'这样的类型左边注意'const'。我真的不喜欢这个,因为它打破了优先顺序,从而左右规则。 – kotlomoy