この質問に答えるとき、gcc (コンパイルされたコード) と clang (コードが拒否された)で次のコードを試しました。
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();
}
constexpr の初期化は問題ないと思いますが、どのコンパイラが正しいかはわかりませんTest::f
。エラーclang出力は次のとおりです。
error: non-type template argument for template parameter of pointer type 'func'
(aka 'long (*)(int)') must have its address taken
- どのコンパイラが正しいですか?
- clang が正しい場合、その理由と、このエラーの本当の意味は何ですか?
編集:「理由」については、DyPの質問を参照してください。