2016-06-04 29 views
0

Angenommen, ich habe die Struktur:Warum müssen Sie eine externe Bindung für Verweise auf Nicht-Typ-Vorlage Argumente

template<const float& myFloat> 
struct Thing{ }; 

Später es zu erklären, ich, dies zu tun haben:

extern constexpr float value = 12.0f; 
Thing<value> MyThing; 

Warum tut dies brauchen das extern Schlüsselwort. Ich meine, es sollte egal sein, ob der Float extern ist oder nicht (sollte es?)

+0

Können Sie ein [MCVE] zeigen, wo 'extern' tatsächlich benötigt wird? –

+0

@ πάνταῥεῖ Mit dem Code, den ich gepostet habe, beschwert sich mein Compiler, wenn es nicht 'extern' ist:' 'value' ist kein gültiges Template-Argument für den Typ 'const float &', da das Objekt 'value' keine externe Verknüpfung hat '(Ich benutze 'gcc') – DarthRubik

+0

GCC muss noch auf die C++ 11 Regeln in diesem Bereich aktualisiert werden. –

Antwort

3

Angenommen, Ihr Code ist irgendwo in einer Header-Datei.

Wie es passiert, hat Thing auch einen Operator(), und es wird in einem std::function in zwei verschiedenen CPP-Dateien gespeichert.

Jemand bekommt die Typids aus den beiden std::function s und fragt, ob sie gleich sind.

Mit externer Verbindung auf dem Schwimmer sind sie eindeutig vom gleichen Typ. Ohne, es gibt keine Möglichkeit auszudrücken, dass sie es sind.

Grundsätzlich ist der Typ abhängig von der Identität nicht der Wert des Float, und nur externe Bindung Globals haben Identität auf der gleichen "Ebene" wie der Standard solche Typen haben will.

Jetzt kann das gleiche von Lambdas gesagt werden, aber lambdas führen zu ODR-Verletzungen extrem oft.