之間的差異在回答this question,我嘗試用gcc下面的代碼(code compiled)和鐺(code rejected):靜態constexpr指針到函數,編譯器
typedef long (*func)(int);
long function(int) { return 42; }
struct Test
{
static constexpr func f = &function;
};
template<func c>
struct Call
{
static void f()
{
c(0);
}
};
int main()
{
Call<Test::f>::f();
}
我不知道哪個編譯器是正確的,雖然我認爲Test::f
的constexpr初始化是可以的。錯誤鐺輸出是:
error: non-type template argument for template parameter of pointer type 'func'
(aka 'long (*)(int)') must have its address taken
- 哪個編譯器是正確的?
- 如果clang是對的,爲什麼,這個錯誤真的意味着什麼?
編輯:對於「爲什麼」,請參閱DyP's question。
我想知道是否'&function'實際上是'constexpr'有效的初始化。兩個編譯器似乎都這麼認爲。但它似乎對我來說很不好。這隻在編譯時才知道,僅在鏈接時。 – Omnifarious 2013-04-07 20:34:54
'&function'是一個函數的地址,所以對我來說它在編譯時是已知的...例如,你可以傳遞一個指針作爲模板參數。 – Synxis 2013-04-07 20:37:45
指向函數的指針是一回事......如果這是共享庫的一部分,例如,該地址如何可能符合「constexpr」? – 2013-04-07 20:46:53