假設我有一個constexpr函數指針數組,我想編寫一個constexpr函數來查找指定函數的數組索引。是否允許在一個constexpr函數中進行函數指針比較?
我可能有這樣的代碼:
void test1(){}void test2(){}void test3(){}void test4(){}
typedef void(*func)(void);
constexpr func funcs[] = { &test1, &test2, &test3 };
constexpr int FindMatchingIdx (const func work, const int idx) {
return (work == funcs[idx]) ? (idx) : (FindMatchingIdx(work, idx + 1));
}
constexpr unsigned int loc = FindMatchingIdx (&test1,0);
現在這個代碼編譯鐺上和MSVC,但GCC將只編譯時FindMatchingIdx
被調用數組中的第一個元素。如果FindMatchingIdx
被調用test1
,GCC將編譯代碼,但是如果FindMatchingIdx
被調用test2
或test3
GCC將無法編譯代碼,給人的錯誤消息:
error: '(test1 != test2)' is not a constant expression.
如果FindMatchingIdx
有遞歸,GCC將未能將其視爲constexpr函數。這是GCC中的錯誤嗎?函數指針比較如何在constexpr函數內工作?顯然,它不能使用實際指針值,因爲鏈接器會指定這些值。
工作例如:https://godbolt.org/g/xfv1PM
它看起來像一個bug,可能是'operator!=(T,T)',其中'T'是一個函數指針不是'constexpr'而'operator ==(T,T)'它是。 – 101010