2016-02-24 55 views
8

我對這些說明符完全感到沮喪,因爲我明白他們自己做什麼,但當我們發現他們彼此使用時很難理解。例如,一些野外代碼中包含 -static,constexpr,const - 它們在一起使用時意味着什麼?

namespace{ 
static constexpr char const *Hello[] = { "HelloString", "WorldString"}; 
... 
} 

這甚至會做什麼?

  • 爲什麼在你已經在匿名命名空間中時使用靜態。和類內的靜態是有意義的(除非你寫C缺乏名稱空間),沒有類 - 爲什麼?
  • 爲什麼使用constexpr - 這裏沒有理由使用它。會不會簡單const會做?
  • 然後const *Hello對我來說沒有意義。這裏常有什麼?字符串或指針*Hello

最糟糕的是,它編譯:/。當然,它會編譯,因爲它們是有效的陳述,但它甚至意味着什麼?

+0

constexpr表明它使用C++ 11。瞭解這個靜態代碼很有意義,因爲它會使初始化線程安全。 (魔術靜力學)。並且constexpr使它可以在不適用於const的地方使用。 – Totonga

+0

我不認爲初始化帶有加載的init-list的標量會編譯。 –

+2

爲什麼神奇的靜態和線程安全對於加載時間初始化來說很重要?那裏會發生什麼樣的平行執行? – IanH

回答

6

爲什麼使用靜態時,你已經在匿名命名空間內?

我沒有看到在這裏的原因,除非它是爲C++ 03兼容性編寫的。

爲什麼使用constexpr - 這裏沒有理由使用它。不會是一個簡單的const會做什麼?

再一次,這裏沒有必要,但它確實表明它是一個編譯時間常量。還要注意,這裏的constexpr表示指針是constexpr,並且在*(參見下一部分)之後不需要const

const *Hello對我沒有意義。這裏常有什麼?字符串或指針*你好?

const適用於左側,除非在這種情況下沒有任何內容適用於右側。 *左邊的const表示解除引用時的指針是一個常量,而右邊表示它是一個常量指針。

char const * ptr = "Foo"; 
ptr[0] = 'B'; //error, ptr[0] is const 

char * const ptr = "Foo"; 
ptr = new char[10]; //error, ptr is const 

char const * const ptr = "Foo"; //cannot assign to either ptr or *ptr 
constexpr char const* ptr = "Foo"; //same as above, constexpr replaced last const 

我發現this頁的「右左」的規則真的理解複雜的聲明幫助。