2013-06-27 106 views
0

這個問題涉及到我之前的問題:clang does not compile my code, but g++ does。從我的研究來看,問題的關鍵在於鏈接,下面的示例中的靜態變量data是否具有鏈接關係(編譯爲g++-4.8.1)?它怎麼會有聯繫(我不會用非類型的模板參數來實例化)?模板函數中的靜態對象是否有鏈接?

template <int const* ptr> 
void foo() 
{ 
} 

typedef void (*func_type)(); 

template <int = 0> 
void run_me() 
{ 
    static int data; 

    func_type const f1 = foo<&data>; 
    // auto f2 = foo<&data>; // doesn't work with gcc 
    // foo<&data>();   // doesn't work with gcc 
} 

int main(int, char*[]) 
{ 
    run_me(); 

    return 0; 
} 
來自標準

強制性報價:

模板參數的用於非類型,非模板模板參數應是以下之一: ...

- 常量表達式(5.19),其指定具有靜態存儲持續時間和 外部或內部連接或與外部或內部的鍵的功能,包括函數模板 和功能模板的IDS,但不包括非靜態類成員,一個對象的地址表示(忽略括號)爲 & ID表達,除了&可能如果名稱是指功能或陣列,並且如果相應的模板參數是一個參考應 可以省略可省略;或 ...

回答

3

當然在功能(無論它是否是一個模板函數)聲明爲靜態變量沒有聯動。

§ 3.5 para。 8:「除註明外,一個名字聲明在塊範圍(3.3.3)沒有聯動」

該條款中列出的唯一的例外,據我所看到的,在對被提供。 6:「塊範圍中聲明的函數的名稱和塊範圍extern聲明聲明的變量的名稱有聯繫。」

但是,它可能是14.3.2可能會在某個時候鬆動。

根據14.3.2 [temp.arg.nontype]段落1的彈頭3中,僅具有聯動對象可以用來形成非類型:

丹尼爾Krügler上2012-02-01提交DR 1451模板參數。這個限制是否仍然需要?使用塊範圍對象作爲模板參數會很方便。

DR是關閉的,因爲它是一個擴展請求,應該由Evolution工作組處理。它似乎已包含在n3413「允許任意文字類型用於非類型模板參數」中。

所以它肯定可以想象,一個或多個C++編譯器可能選擇執行非類型模板參數的寬鬆限制。

+0

我的想法確切,但誰知道,2編譯器似乎認爲,否則。 – user1095108

+0

@ user1095108:請參閱編輯。 – rici