2013-01-09 89 views
4

雖然C++標準不允許使用字符串文字作爲模板參數,它允許這樣的事情:字符串作爲模板參數

ISO/IEC 14882:2011

14.3 0.2模板非類型參數[temp.arg.nontype]

2 [注:字符串文字(2.14.5)不滿足要求的任何這些類別的 並且因此不是可接受 模板 - 論據。 [示例:

template<class T, const char* p> class X {/.../};

X<int, "Studebaker"> x1; // error: string literal as template-argument

const char p[] = "Vivisectionist";
X<int,p> x2; // OK

末端示例]末端注]

那麼,爲什麼下面的代碼給我一個錯誤在所有編譯器(gcc 4.7.2,MSVC-11.0,Comeau)?

template <const char* str> 
void foo() {} 

int main() 
{ 
    const char str[] = "str"; 
    foo<str>(); 
} 
+0

+1它使用類似MSCV 6或7。但是我最後一次嘗試它不再編譯:-(高興你問這個問題的工作。 –

回答

5

倒回幾行。

14.3.2/1:一個常量表達式(5.19),用於指定具有靜態存儲持續時間的對象的地址以及外部或內部鏈接。

4

注意下面的改裝工程:

template <const char* str> 
void foo() {} 

char str[] = "str"; 

int main() { 
    foo<str>(); 
} 

一個簡短的說明見http://www.comeaucomputing.com/techtalk/templates/#stringliteral

+0

你是對的,除去'const'有所幫助。不過,我認爲它只是證明在代碼中處理常量編譯器錯誤,因爲'爲const char p [] =「」'仍然定義外部對象 – jpalecek

+0

@Cornstalks:哦,是的,'const'是很重要的位置:比較HTTP:// ideone。 COM/rY7ZWI和http://ideone.com/u4LbEC(雖然你是對不使用局部變量是必不可少的,我只是想它的變化和整個'const'東西來......) – jpalecek

+0

因此,它是編譯器錯誤? – FrozenHeart