<random> classesSection: 29.5.4 [rand.eng], 29.5.5 [rand.adapt], 29.5.9 [rand.dist] Status: C++23 Submitter: Jens Maurer Opened: 2021-02-02 Last modified: 2023-11-22
Priority: 3
View all other issues in [rand.eng].
View all issues with C++23 status.
Discussion:
The synopses for the engine and distribution classes in <random> do
not show declarations operator==, operator!=, operator<<,
and operator>>, although they are part of the engine and distribution requirements.
[2021-02-07: Daniel provides concrete wording]
The proposed wording attempts to use a conservative approach in regard to exception specifications. Albeit
29.5.4.1 [rand.eng.general] p3 says that "no function described in 29.5.4 [rand.eng] throws
an exception" (unless specified otherwise), not all implementations have marked the equality operators
as noexcept (But some do for their engines, such as VS 2019). [No implementations marks the IO
stream operators as noexcept of-course, because these cannot be prevented to throw exceptions in
general by design].
operator!=, because the auto-generated form already has
the right semantics. The wording also covers the engine adaptor class templates because similar requirements
apply to them.
[2021-03-12; Reflector poll]
Set priority to 3 following reflector poll.
[2021-03-12; LWG telecon]
Set status to Tentatively Ready after discussion and poll.
| F | A | N |
|---|---|---|
| 10 | 0 | 0 |
[2021-06-07 Approved at June 2021 virtual plenary. Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4878.
Modify 29.5.4.2 [rand.eng.lcong] as indicated:
template<class UIntType, UIntType a, UIntType c, UIntType m>
class linear_congruential_engine {
[…]
// constructors and seeding functions
[…]
// equality operators
friend bool operator==(const linear_congruential_engine& x, const linear_congruential_engine& y);
// generating functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const linear_congruential_engine& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, linear_congruential_engine& x);
};
Modify 29.5.4.3 [rand.eng.mers] as indicated:
template<class UIntType, size_t w, size_t n, size_t m, size_t r,
UIntType a, size_t u, UIntType d, size_t s,
UIntType b, size_t t,
UIntType c, size_t l, UIntType f>
class mersenne_twister_engine {
[…]
// constructors and seeding functions
[…]
// equality operators
friend bool operator==(const mersenne_twister_engine& x, const mersenne_twister_engine& y);
// generating functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const mersenne_twister_engine& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, mersenne_twister_engine& x);
};
Modify 29.5.4.4 [rand.eng.sub] as indicated:
template<class UIntType, size_t w, size_t s, size_t r>
class subtract_with_carry_engine {
[…]
// constructors and seeding functions
[…]
// equality operators
friend bool operator==(const subtract_with_carry_engine& x, const subtract_with_carry_engine& y);
// generating functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const subtract_with_carry_engine& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, subtract_with_carry_engine& x);
};
Modify 29.5.5.2 [rand.adapt.disc] as indicated:
template<class Engine, size_t p, size_t r>
class discard_block_engine {
[…]
// constructors and seeding functions
[…]
// equality operators
friend bool operator==(const discard_block_engine& x, const discard_block_engine& y);
// generating functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const discard_block_engine& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, discard_block_engine& x);
};
Modify 29.5.5.3 [rand.adapt.ibits] as indicated:
template<class Engine, size_t w, class UIntType>
class independent_bits_engine {
[…]
// constructors and seeding functions
[…]
// equality operators
friend bool operator==(const independent_bits_engine& x, const independent_bits_engine& y);
// generating functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const independent_bits_engine& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, independent_bits_engine& x);
};
Modify 29.5.5.4 [rand.adapt.shuf] as indicated:
template<class Engine, size_t k>
class shuffle_order_engine {
[…]
// constructors and seeding functions
[…]
// equality operators
friend bool operator==(const shuffle_order_engine& x, const shuffle_order_engine& y);
// generating functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const shuffle_order_engine& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, shuffle_order_engine& x);
};
Modify 29.5.9.2.1 [rand.dist.uni.int] as indicated:
template<class IntType = int>
class uniform_int_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const uniform_int_distribution& x, const uniform_int_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const uniform_int_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, uniform_int_distribution& x);
};
Modify 29.5.9.2.2 [rand.dist.uni.real] as indicated:
template<class RealType = double>
class uniform_real_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const uniform_real_distribution& x, const uniform_real_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const uniform_real_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, uniform_real_distribution& x);
};
Modify 29.5.9.3.1 [rand.dist.bern.bernoulli] as indicated:
class bernoulli_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const bernoulli_distribution& x, const bernoulli_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const bernoulli_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, bernoulli_distribution& x);
};
Modify 29.5.9.3.2 [rand.dist.bern.bin] as indicated:
template<class IntType = int>
class binomial_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const binomial_distribution& x, const binomial_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const binomial_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, binomial_distribution& x);
};
Modify 29.5.9.3.3 [rand.dist.bern.geo] as indicated:
template<class IntType = int>
class geometric_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const geometric_distribution& x, const geometric_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const geometric_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, geometric_distribution& x);
};
Modify 29.5.9.3.4 [rand.dist.bern.negbin] as indicated:
template<class IntType = int>
class negative_binomial_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const negative_binomial_distribution& x, const negative_binomial_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const negative_binomial_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, negative_binomial_distribution& x);
};
Modify 29.5.9.4.1 [rand.dist.pois.poisson] as indicated:
template<class IntType = int>
class poisson_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const poisson_distribution& x, const poisson_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const poisson_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, poisson_distribution& x);
};
Modify 29.5.9.4.2 [rand.dist.pois.exp] as indicated:
template<class RealType = double>
class exponential_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const exponential_distribution& x, const exponential_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const exponential_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, exponential_distribution& x);
};
Modify 29.5.9.4.3 [rand.dist.pois.gamma] as indicated:
template<class RealType = double>
class gamma_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const gamma_distribution& x, const gamma_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const gamma_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, gamma_distribution& x);
};
Modify 29.5.9.4.4 [rand.dist.pois.weibull] as indicated:
template<class RealType = double>
class weibull_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const weibull_distribution& x, const weibull_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const weibull_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, weibull_distribution& x);
};
Modify 29.5.9.4.5 [rand.dist.pois.extreme] as indicated:
template<class RealType = double>
class extreme_value_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const extreme_value_distribution& x, const extreme_value_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const extreme_value_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, extreme_value_distribution& x);
};
Modify 29.5.9.5.1 [rand.dist.norm.normal] as indicated:
template<class RealType = double>
class normal_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const normal_distribution& x, const normal_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const normal_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, normal_distribution& x);
};
Modify 29.5.9.5.2 [rand.dist.norm.lognormal] as indicated:
template<class RealType = double>
class lognormal_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const lognormal_distribution& x, const lognormal_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const lognormal_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, lognormal_distribution& x);
};
Modify 29.5.9.5.3 [rand.dist.norm.chisq] as indicated:
template<class RealType = double>
class chi_squared_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const chi_squared_distribution& x, const chi_squared_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const chi_squared_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, chi_squared_distribution& x);
};
Modify 29.5.9.5.4 [rand.dist.norm.cauchy] as indicated:
template<class RealType = double>
class cauchy_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const cauchy_distribution& x, const cauchy_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const cauchy_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, cauchy_distribution& x);
};
Modify 29.5.9.5.5 [rand.dist.norm.f] as indicated:
template<class RealType = double>
class fisher_f_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const fisher_f_distribution& x, const fisher_f_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const fisher_f_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, fisher_f_distribution& x);
};
Modify 29.5.9.5.6 [rand.dist.norm.t] as indicated:
template<class RealType = double>
class student_t_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const student_t_distribution& x, const student_t_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const student_t_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, student_t_distribution& x);
};
Modify 29.5.9.6.1 [rand.dist.samp.discrete] as indicated:
template<class IntType = int>
class discrete_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const discrete_distribution& x, const discrete_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const discrete_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, discrete_distribution& x);
};
Modify 29.5.9.6.2 [rand.dist.samp.pconst] as indicated:
template<class RealType = double>
class piecewise_constant_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const piecewise_constant_distribution& x, const piecewise_constant_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const piecewise_constant_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, piecewise_constant_distribution& x);
};
Modify 29.5.9.6.3 [rand.dist.samp.plinear] as indicated:
template<class RealType = double>
class piecewise_linear_distribution {
[…]
// constructors and reset functions
[…]
// equality operators
friend bool operator==(const piecewise_linear_distribution& x, const piecewise_linear_distribution& y);
// generating functions
[…]
// property functions
[…]
// inserters and extractors
template<class charT, class traits>
friend basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const piecewise_linear_distribution& x);
template<class charT, class traits>
friend basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, piecewise_linear_distribution& x);
};