2013-12-18 66 views
7

我有以下代碼:Const之前或之後的類型?

string const& operator[] (size_t index) const { return elems[index]; } 

豈不是:

const string& 

+5

這裏沒有什麼區別。 – Rapptz

+0

以最純粹的形式,應該保持一致。它可以在左邊的事實是例外,真的。這就是說,我個人更喜歡離開。 – chris

+0

我認爲如果你把它放在正確的位置,讀取類型名稱會更容易,但它沒有區別。 – Simple

回答

16

cv修飾符像const適用於任何對他們的左側,除非有什麼,在這種情況下,他們申請的權利。對於string const&const適用於其左側的string。對於const string&const適用於其右側的string。也就是說,它們都是對conststring的引用,所以在這種情況下,它沒有區別。

有些人喜歡把它左邊(如const int),因爲它讀取由左到右。有些人喜歡把它右邊(如int const)避免使用特殊情況(int const * constconst int* const較爲一致,例如)。

+0

什麼是const const * const和int const * const?....? – Sangram

+0

@ user2745266它們都是const的int指針。 –

+0

感謝您的回覆。我想問的是,在這兩種情況下(const哪一個用於int,哪一個用於指針)都應用'const'。也許我應該以適當的方式提問。謝謝。 – Sangram

3

它工作在這種情況下無論哪種方式,並且是個人喜好和編碼規範的問題。

一些程序員更喜歡在之後輸入的類型名稱,以便與const的其他用途更加一致。例如,如果你聲明的指針在指針本身(而不是指向的類型)是要const,你需要把它星號後:

string * const ptr; 

同樣,如果你是聲明一個const成員函數,它需要在函數聲明之後去;例如:

class Foo 
{ 
    void func() const; 
}; 
5

const可以是對數據類型,以便的任一側:

const int *」是一樣的「int const *

const int * const」是一樣的「int const * const

int *ptr;   // ptr is pointer to int 
int const *ptr;  // ptr is pointer to const int 
int * const ptr;  // ptr is const pointer to int 
int const * const ptr; // ptr is const pointer to const int 
int ** const ptr;  // ptr is const pointer to a pointer to an int 
int * const *ptr;  // ptr is pointer to a const pointer to an int 
int const **ptr;  // ptr is pointer to a pointer to a const int 
int * const * const ptr; // ptr is const pointer to a const pointer to an int 

基本規則是const applies to the thing left of it. If there is nothing on the left then it applies to the thing right of it.