這個問題涉及到我之前的問題: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表達,除了&可能如果名稱是指功能或陣列,並且如果相應的模板參數是一個參考應 可以省略可省略;或 ...
我的想法確切,但誰知道,2編譯器似乎認爲,否則。 – user1095108
@ user1095108:請參閱編輯。 – rici