2017-01-08 5 views
0

heute jemand stellte mich mit dem Code der folgenden Form: http://coliru.stacked-crooked.com/a/3a786c42b5204b0aKann eine variable Vorlage mutiert werden?

ich diesen Code zu erwarten 42 zu drucken, da 10 erscheint in einem temporären zugeordnet werden soll:

#include <iostream> 

namespace example { 
    template <typename T> 
    T variable_template = T(42); 
} 

int main() { 
    example::variable_template<int> = 10; 
    std::cout << example::variable_template<int> << std::endl; 
} 

Sie hier laufen sehen . Innerhalb des Namespace ist die Vorlage nur eine Deklaration (keine Instantiierung), daher gibt es keine Daten, die innerhalb des Namespace mutieren. Trotzdem überraschte es mich und druckte stattdessen 10.

Ich hätte auch eine Warnung über die Zuweisung zu einem temporären erwartet, aber das ist auch nicht passiert.

Ist dieses undefinierte Verhalten, ist mein Verständnis von Vorlagen fehlerhaft, oder läuft etwas anderes?

+0

_ "Ich habe erwartet, dass dieser Code 42 druckt, da 10 anscheinend einem temporären zugeordnet ist." _ Was temporär? –

Antwort

4

Innerhalb des Namespace ist die Vorlage nur eine Deklaration (keine Instantiierung), daher gibt es keine Daten, die innerhalb des Namespaces mutieren.

Nicht so!

[C++14: 14.7.2/6]: Eine explizite Instanziierung einer Klasse, Funktionsschablone oder variable Template-Spezialisierung wird die Schablone definiert ist in dem Namensraum, in dem platziert. [..]

Wenn Sie eine Klassenvorlage haben Foo und beziehen sich auf eine Instantiierung (etwa Foo<int>), dass Instanziierung existiert wie eine normale Klasse, mit dem gleichen Umfang wie die Vorlage hatte.

Es gibt nichts anderes mit variablen Vorlagen. Wenn Sie auf example::variable_template<int> verweisen, "fügen" Sie diese Variable zu dem Bereich hinzu, der die Vorlage enthält.

Ihr Namespace example enthält dann eine Variable namens variable_template<int>.


ich erwartet hatte auch eine Warnung über die Zuordnung zu einer vorübergehenden haben würde, aber das hat auch nicht passieren.

Es gibt keine Provisorien hier, abgesehen von der T(42).

+0

Danke, gibt es ein relevantes Standardangebot, das Sie hinzufügen könnten? :) – OMGtechy

+0

@OMGtechy: Nicht wirklich; Ich würde fast das ganze Kapitel über Templates zitieren müssen, um die Fantasie zu widerlegen, dass du hier ein temporäres hast :) –

+0

Nun, die eine, die du just hinzugefügt hast, war genau das, wonach ich gesucht habe, nochmals vielen Dank – OMGtechy

Verwandte Themen