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
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
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
'seed()' nimmt eine Referenz, "etwas, das möglicherweise ändern kann". Du gibst etwas, das nicht geändert werden kann. – fedepad