Nel rispondere this question, ho provato il seguente codice con GCC (code compiled) e clang (code rejected):constexpr statica puntatore a funzione, differenza tra i compilatori
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();
}
io non sono sicuro che il compilatore è giusto, anche se penso che l'inizializzazione di constexpr di Test::f
sia ok. Le uscite errore clang è:
error: non-type template argument for template parameter of pointer type 'func'
(aka 'long (*)(int)') must have its address taken
- quale compilatore è giusto?
- Se clang ha ragione, perché e cosa significa veramente questo errore?
EDIT: per il "perché", vedi DyP's question.
Mi chiedo anche se non 'e function' è in realtà un inizializzatore valido per' constexpr'. Entrambi i compilatori sembrano pensarla così. Ma sembra incerto per me. Questo non è noto al momento della compilazione, solo al momento del collegamento. – Omnifarious
'& function' è l'indirizzo di una funzione, quindi per me è noto al momento della compilazione ... Ad esempio, puoi passare un puntatore a funzionare come argomento modello. – Synxis
Un puntatore a una funzione è una cosa ... se questo faceva parte di una libreria condivisa, ad esempio, in che modo l'indirizzo può essere qualificato come 'constexpr'? –