Warum ist std :: seed_seq nicht nach C ++ 11 kopierbar, und warum passt gcc / clang nicht?

9

Betrachten Sie das folgende minimale Beispiel:

%Vor%

Nach dem C ++ - Standard sollte dies nicht kompiliert werden, da std::seed_seq weder kopiert wird konstruierbar und nicht zuweisbar kopieren .

Dies kompiliert jedoch sowohl mit g++ 4.9 als auch mit clang 3.4

%Vor%

Die android ndk llvm-libc++ Implementierung scheint der "nicht kopierbar" Eigenschaft von seed_seq zu folgen. Was in der Quelle unter

bestätigt werden kann %Vor%

Oder indem Sie das minimale Beispiel mit

kompilieren %Vor%

Ich habe dies bereits verwendet (ohne meinen nicht konformen Code zu kennen), um eine Kopie des Seeds für Protokollierungszwecke zu speichern. *

Ich frage mich:

  1. Warum ist seed_seq nicht kopierbar?

  2. Dies ist das erste Mal, dass g++ und clang nicht dem Standard entsprechen. Ist es eine bewusste Entscheidung, vom Standard abzuweichen, oder handelt es sich um einen Implementierungsfehler? Wie weit verbreitet ist das? Ich würde gerne mehr erfahren.

* Ich habe festgestellt, dass ich an seed_seq falsch gedacht habe, und dass, wenn ich nur an den seed_seq::param Werten interessiert bin (die seed_seeq 's anfänglichen Startwerte), dass ich stattdessen meine Kopie behalten soll a vector<T> , anstelle eines Typs, der ganze Zahlen erzeugen soll.

    
swalog 30.03.2015, 15:21
quelle

1 Antwort

1

Für diejenigen, die dies in der Zukunft sehen, laut T.C. und ecatmur, das ist libstdc ++ Fehler 65631 . Es gibt jedoch keine ETA, die repariert werden kann. das Verhalten stimmte mit dem ursprünglichen Vorschlag überein, aber dies wurde geändert, um die Kopierbarkeit aus dem Konzept zu entfernen, um LWG-Problem 1069 zu adressieren, gemäß der N3037-Papier .

    
LThode 10.04.2015 14:15
quelle

Tags und Links