Sezione 26.5.1.1 comma 1, del C++ 11 standard (N3242) dice:C++ 11 generatore di numeri casuali UIntType contraddizione
In tutta questa sottoclausola 26,5, l'effetto di istanziare un modello:
[...]
f) che dispone di un parametro di tipo di modello di nome
UIntType
è indefinito a meno che il corrispondente modello argomento è cv-qualificato ed è uno deiunsigned short
,unsigned int
, 0.123.ounsigned long long
.
E definisce il generatore congruenziale lineare in 26.5.3.1. La definizione della classe inizia così:
template<class UIntType, UIntType a, UIntType c, UIntType m>
class linear_congruential_engine
minstd_rand0
sembra violare questa restrizione:
typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
minstd_rand0;
quanto utilizza uint_fast32_t (che non è garantito per essere uno dei unsigned short
, unsigned int
, unsigned long
, oppure unsigned long long
) in minstd_rand0
per un parametro modello denominato UIntType
, sembra avere un effetto indefinito su #include <random>
o almeno su minstd_rand0
. Questo problema si applica anche ad altri RNG predefiniti e non sembra corretto in C++ 14.
Le mie domande sono:
- Questa è davvero una contraddizione (o meglio una quantità estrema di comportamento non definito), o sono ho perso qualcosa?
- È stato menzionato in un rapporto sui difetti?
Edit: Ho notato che this rapporto difetto sembra essere correlato a questo problema.
Bene, la clausola * Comportamento richiesto * che segue immediatamente richiede necessariamente l'utilizzo di una cosa del genere per essere ben definita. Indipendentemente da ciò, esiste un sistema reale in cui 'uint_fast32_t' è * non * uno di questi tipi? –
@ T.C. Suppongo che potrebbe, ma penso che richieda solo che la 10000a invocazione sia corretta. L'invocazione 10001th potrebbe ancora causare un problema (o, per altro, un motore che non è stato costruito in modo predefinito). – qbt937
@ T.C. MSVC potrebbe definire 'uint_fast32_t' usando il loro tipo' unsigned __int32' (non so come non usi MSVC). Sono d'accordo che questa domanda è accademica però. – qbt937