Warum benötigt g ++ noch -latomic

Im 29.5 Atomtypen des C ++ Standard-Arbeitsentwurfs vom November 2014 heißt es:

Es gibt eine generische atomare Klassenvorlage. Der Typ des Vorlagenarguments T muss einfach kopierbar sein (3.9). [Hinweis: Typargumente, die nicht auch statisch initialisierbar sind, sind möglicherweise schwierig zu verwenden. —Ende Notiz]

So - soweit ich das beurteilen kann - das:

#include <atomic>

struct Message {
    unsigned long int a;
    unsigned long int b;
};

std::atomic<Message> sharedState;

int main() {    
    Message tmp{1,2};       
    sharedState.store(tmp);         
    Message tmp2=sharedState.load();
}

sollte vollkommen gültiger Standard-C ++ 14-Code (und auch C ++ 11-Code) sein. Wenn ich jedoch kein @ verlinlibatomic manuell den Befehl

g++ -std=c++14 <filename>

gives - zumindest auf Fedora 22 (gcc 5.1) - folgender Linkfehler:

/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status

Wenn ich schreibe

g++ -std=c++14 -latomic <filename>

alles ist gut. Ich weiß, dass der Standard nichts über Compiler-Flags oder Bibliotheken aussagt, die eingeschlossen werden müssen, aber bisher dachte ich, dass jeder standardkonforme einzelne Dateicode über den ersten Befehl kompiliert werden kann.

Warum gilt das nicht für meinen Beispielcode? Gibt es ein rationales warum-latomic ist immer noch notwendig, oder wurde es nur noch nicht von den Betreuern des Compilers angesprochen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage