2015-08-17 18 views
13

Si consideri il seguente casostatic_assert sulla funzione inline dà l'errore

typedef void (*foo)(); 
template<foo f> 
struct bar { 
    static_assert(f!=nullptr,"f == null!"); 
}; 

void baz() {} 
inline void bax() { } 

bar<baz> ok; 
bar<bax> bad; // error: non-constant condition for static assertion 

Sia baz e bax sono accettati come argomenti di template. Indica che entrambi sono accettati come costanti. Tuttavia, a static_assert sembrano essere diversi (almeno in gcc 4.9) - bax non è più una costante.

La mia ipotesi era che il modello static_assert e il modello valutino la costanza in modo identico. E.g. o errore dovrebbe essere

  • 'Bax non è un argomento valido modello' o
  • static_assert non dovrebbe sollevare errore condizione non costante.

Mi sbaglio?

+1

A meno che 'foo' sia dichiarato da qualche parte, mi aspetto che questo non si compili affatto ... –

+0

corretto, perso typedef void (* foo)(); aggiunto – hutorny

+1

VC++ 14.0 accetta entrambi. – Fireho

risposta

1

Quando una funzione è in linea, il puntatore alla funzione non esiste. Quindi non possiamo confrontarlo con nullptr.

Se una funzione è eventualmente in linea o meno, dipende dal compilatore. La parola chiave inline non lo garantisce.

+1

Errore: se si prende l'indirizzo di una funzione (anche quella' inline'd) il compilatore dovrebbe darlo (e non sempre in linea quella funzione) –