Sind statische Locals von Funktionsvorlagenspezialisierungen mit T = unbenannte Namespace-Klasse erforderlich, um eindeutig zu sein?

8

Wir verwenden den Intel C ++ - Compiler und haben festgestellt, dass er Folgendes falsch übersetzt (?), reduziert von einer Verwendung von boost::function<Ponies()> f(unnamedNamespacedFunctor) .

a1.cc:

%Vor%

a2.cc:

%Vor%

main.cc:

%Vor%

Befehlszeile:

%Vor%

Meine Frage ist: Ist das konform? Führt die Verwendung von statischen Locals in solchen Instanziierungen zu undefiniertem Verhalten? Bei der Überprüfung der erzeugten Symbole habe ich festgestellt, dass, während f eine lokale Verknüpfung hat, wie ich vermutete, die statische Variable x schwache Verknüpfung erhält und daher die beiden x 'es zusammengeführt werden und Lotterie wird gewählt / p> %Vor%

Ich wäre dankbar für die Hilfe. Vielleicht ist das eigentlich doch ein Compiler-Bug und es wurde schon berichtet?

    
Johannes Schaub - litb 21.10.2015, 14:52
quelle

1 Antwort

2

Das sieht für mich wie ein Fehler aus. % Co_de% ist eine der Instanzen von A1 und A ist die andere:

Ich nehme an, dass die statische A2 eine schwache Bindung hat, so dass der Linker Kopien der statischen zwischen mehreren Kopien der gleichen Instanziierung zusammenführen kann. (Wenn Sie x beispielsweise in zwei verschiedenen Übersetzungseinheiten instanziiert haben.)

Entweder f<A1> und f<A1> sollten unterschiedliche Namen haben, was dazu führen würde, dass die beiden Versionen von f<A2> einen anderen Namen haben. (Ich denke, einige Compiler generieren tatsächlich einen zufälligen Wert, um Namen in anonymen Namespaces eindeutig zu machen) oder andernfalls sollte x keine interne Verknüpfung haben (weil ein lokaler Typ verwendet wurde, um x zu instanziieren, was es unmöglich machen sollte, in einer anderen Übersetzungseinheit zu replizieren).

    
John Calsbeek 21.10.2015, 15:48
quelle