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?
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).
Tags und Links c++ undefined-behavior templates icc static