2017-02-09 1 views
0

Ich habe folgende Codezeilen, die die aktuelle Version von GCC nicht kompilieren kann. Ich bin mir sicher, dass es nicht einmal eine Warnmeldung gab.std :: seed_seq Kompilierungsfehler (GCC Bug?)

seed_seq.cpp:

void func() 
{ 
    std::mt19937_64 engine; 
    std::hash<std::thread::id> hasher; 
    uint64_t rdSeed, threadID, now; 

    try 
    { 
     std::random_device rd; 

     if (rd.entropy()) 
      rdSeed = rd(); 
     else 
      rdSeed = 0; 
    } 
    catch (std::exception &) 
    { 
     rdSeed = 0; 
    } 

    threadID = hasher(std::this_thread::get_id()); 

    now = std::chrono::system_clock::now().time_since_epoch().count(); 

    engine.seed(std::seed_seq{ rdSeed, threadID, now }); 
} 

Befehl: gcc -std=c++11 -c seed_seq.cpp -o seed_seq.o

GCC-Versionen, die nicht zusammenstellen können:

  • gcc (GCC) 6.3.1 20.161.221 (Red Hat 6.3.1 -1)
  • gcc (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.4) 5.4.0 20160609

VS2013 Update 5 nicht zu beanstanden. Definitiv ist es GCC Schuld?

Ich erinnere mich nicht an die Version von GCC, die funktionierte. Es tut uns leid.

Fehler:

seed_seq.cpp: In function ‘void func()’: 
seed_seq.cpp:28:19: error: invalid initialization of non-const reference of type ‘std::seed_seq&’ from an rvalue of type ‘std::seed_seq’ 
    engine.seed(std::seed_seq{ rdSeed, threadID, now }); 
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
In file included from /usr/include/c++/6.3.1/random:51:0, 
       from seed_seq.cpp:2: 
/usr/include/c++/6.3.1/bits/random.tcc:353:7: note: initializing argument 1 of ‘typename std::enable_if<std::is_class<_Sseq>::value>::type std::mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::seed(_Sseq&) [with _Sseq = std::seed_seq; _UIntType = long unsigned int; long unsigned int __w = 64ul; long unsigned int __n = 312ul; long unsigned int __m = 156ul; long unsigned int __r = 31ul; _UIntType __a = 13043109905998158313ul; long unsigned int __u = 29ul; _UIntType __d = 6148914691236517205ul; long unsigned int __s = 17ul; _UIntType __b = 8202884508482404352ul; long unsigned int __t = 37ul; _UIntType __c = 18444473444759240704ul; long unsigned int __l = 43ul; _UIntType __f = 6364136223846793005ul; typename std::enable_if<std::is_class<_Sseq>::value>::type = void]’ 
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
      __s, __b, __t, __c, __l, __f>:: 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

aktualisieren

Fand dieses auf dem dnf.log des Systems. Nicht sicher, welches ist diejenige, die ich verwendet es auf meinem Projekt ...

Nov 01 18:17:41 DEBUG ---> Package gcc-gdb-plugin.x86_64 6.2.1-2.fc24 will be installed 
Nov 01 18:17:42 DEBUG ---> Package gcc.x86_64 5.3.1-6.fc23 will be upgraded 
Nov 01 18:17:42 DEBUG ---> Package gcc.x86_64 6.2.1-2.fc24 will be an upgrade 
Nov 01 18:17:42 DEBUG ---> Package gcc-c++.x86_64 5.3.1-6.fc23 will be upgraded 
Nov 01 18:17:42 DEBUG ---> Package gcc-c++.x86_64 6.2.1-2.fc24 will be an upgrade 
Nov 01 18:17:42 DEBUG ---> Package libgcc.x86_64 5.3.1-6.fc23 will be upgraded 
Nov 01 18:17:42 DEBUG ---> Package libgcc.x86_64 6.2.1-2.fc24 will be an upgrade             
Nov 02 11:03:25 DEBUG ---> Package gcc-debuginfo.x86_64 6.2.1-2.fc24 will be installed 
Nov 02 11:03:25 DEBUG ---> Package gcc-base-debuginfo.x86_64 6.2.1-2.fc24 will be installed 

Jan 04 09:59:34 DEBUG ---> Package gcc.x86_64 6.2.1-2.fc24 will be upgraded 
Jan 04 09:59:34 DEBUG ---> Package gcc.x86_64 6.3.1-1.fc24 will be an upgrade 
Jan 04 09:59:34 DEBUG ---> Package gcc-gdb-plugin.x86_64 6.2.1-2.fc24 will be upgraded 
Jan 04 09:59:34 DEBUG ---> Package gcc-gdb-plugin.x86_64 6.3.1-1.fc24 will be an upgrade 
Jan 04 09:59:34 DEBUG ---> Package gcc-c++.x86_64 6.2.1-2.fc24 will be upgraded 
Jan 04 09:59:34 DEBUG ---> Package gcc-c++.x86_64 6.3.1-1.fc24 will be an upgrade 
Jan 04 09:59:34 DEBUG ---> Package libgcc.x86_64 6.2.1-2.fc24 will be upgraded 
Jan 04 09:59:34 DEBUG ---> Package libgcc.x86_64 6.3.1-1.fc24 will be an upgrade 
+0

Welche gcc-Version ist die offensichtliche Frage hier. Und haben Sie zum Beispiel -Wall -pedantic beim Kompilieren verwendet? Und welcher Fehler ist "Art" wichtig ... Was 'engine.seed()' tut? Hier zum Beispiel, um 10 Zahlen zu erzeugen, beginnend mit der Sequenz seq, benutzt sie die generate Methode http://en.cppreference.com/w/cpp/numeric/random/seed_seq – fedepad

+0

Ihr Code (mit 'this -> __ ctx-> engine. seed (seq); 'removed) kompiliert OK auf GCC 6.1, 6.2, 6.3 und 7 (Snapshot). https://godbolt.org/g/hU4Rz0 – gurka

+0

'seed()' nimmt eine Referenz, "etwas, das möglicherweise ändern kann". Du gibst etwas, das nicht geändert werden kann. – fedepad

Antwort

0

Klar, dass die Parameter, die Sie engine.seed() geben wurden, ist das Problem.
Ich schlage vor, Sie bei

seed()

Lassen Sie uns deshalb kurz sehen suchen.
Wie Sie sehen können, gibt es zwei Möglichkeiten, seed() durch die folgenden definiert zu nennen:

void seed(result_type value = default_seed); 

und

void seed(Sseq& seq); 

Wenn Sie besorgt um einen Fehler in gcc gibt es, auch ich glaube nicht, Du solltest.
Tat Clang 3.9.1 (nur eine Version zu erwähnen) verursacht einen ähnlichen Fehler zu:

Start 
prog.cc:32:12: error: no matching member function for call to 'seed' 
    engine.seed(std::seed_seq{ rdSeed, threadID, now }); 
    ~~~~~~~^~~~ 
/opt/wandbox/clang-3.9.1/include/c++/v1/random:2116:10: note: candidate function not viable: no known conversion from 'std::seed_seq' to 'result_type' (aka 'unsigned long') for 1st argument 
    void seed(result_type __sd = default_seed); 
     ^
/opt/wandbox/clang-3.9.1/include/c++/v1/random:2124:9: note: candidate function [with _Sseq = std::__1::seed_seq] not viable: expects an l-value for 1st argument 
     seed(_Sseq& __q) 
     ^
1 error generated. 
1 
Finish 

und Punkte, die Sie genau das Problem.
Ich finde es sehr unwahrscheinlich, dass sowohl gcc und clang möglicherweise den gleichen Fehler haben, aber alles könnte möglich sein.
Um zu sehen, wie Sie seed() in Kombination mit std::seed_seq aufrufen können Sie die folgenden seed(), die genau ein ähnliches Beispiel hat.
Das Problem kann gelöst werden, wie Sie bereits entweder

std::seed_seq seq{ rdSeed, threadID, now }; 
engine.seed(seq); 
erwähnt

oder (die Art und Weise zu ausführlich ist, und ich würde es nicht wahrscheinlich tun):

std::seed_seq seq{ rdSeed, threadID, now }; 
std::seed_seq& pr = seq; 
engine.seed(pr); 

mehr lesen über diese Art von Lage/Art von Fehler, empfehle ich Ihnen das lesen folgende SO Beitrag:
invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'

Wie @Ashe der Mensch in den Kommentaren darauf hingewiesen, VS2013 lassen Sie es kompilieren, weil es eine standardmäßig aktivierte Spracherweiterung: Sie soll eine Warnung ausgeben, um die Leute wissen zu lassen. Sie können mehr darüber hier lesen:
Non-const reference bound to temporary, Visual Studio bug?

+0

Sie haben nicht darauf hingewiesen, warum VS2013 es kompilieren ließ. Es ist standardmäßig eine Spracherweiterung aktiviert. Windows SDK kann nicht ohne es kompiliert werden. http://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug –

+0

oooooo hasse ich überteuerte Microsoft-Produkte. –

+0

@Ashethehuman Sie haben Recht! Sorry, aber ich habe kein Windows, also habe ich nicht einmal danach gesucht ... Ich werde es in die Antwort aufnehmen! Gut zu wissen, interessant! – fedepad

Verwandte Themen