2015-08-17 4 views
13

Betrachten Sie den folgenden Fallstatic_assert auf Inline-Funktion gibt Fehler

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 

Sowohl baz und bax als Vorlage Argument akzeptiert. Es zeigt an, dass beide als Konstanten akzeptiert werden. Jedoch scheinen sie bei static_assert anders zu sein (mindestens in gcc 4.9) - bax ist keine Konstante mehr.

Meine Annahme war, dass static_assert und Vorlage Gleichheit identisch auszuwerten. Zum Beispiel entweder Fehler sollte

  • ‚Bax ist kein gültiges Templateargument‘ oder
  • static_assert sollte nicht erhöhen nicht konstanten Zustand Fehler.

Bin ich falsch?

+1

Wenn nicht 'foo' irgendwo deklariert ist, erwarte ich, dass das überhaupt nicht kompiliert wird ... –

+0

behoben, verloren typedef void (* foo)(); hinzugefügt – hutorny

+1

VC++ 14.0 akzeptiert beide. – Fireho

Antwort

1

Wenn eine Funktion inline ist, ist der Zeiger auf die Funktion nicht vorhanden. Also können wir es nicht mit nullptr vergleichen.

Ob eine Funktion letztendlich inline ist oder nicht, hängt vom Compiler ab. inline Schlüsselwort garantiert das nicht.

+1

Falsch: wenn Sie die Adresse einer Funktion (auch eine 'Inline'd) nehmen, sollte der Compiler es geben (und nicht immer inline diese Funktion) –