2013-10-27 40 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