std::seed_seq::seed_seq
来自cppreference.com
seed_seq() noexcept; | (1) | (C++11 起) |
seed_seq( const seed_seq& ) = delete; | (2) | (C++11 起) |
template< class InputIt > seed_seq( InputIt begin, InputIt end ); | (3) | (C++11 起) |
template< class T > seed_seq( std::initializer_list<T> il ); | (4) | (C++11 起) |
1) 默认构造函数。构造后
v
为空。2) 复制构造函数被弃置:
std::seed_seq
不可复制。3) 从范围
。
[
begin,
end)
的值构造 std::seed_seq
。等价于在默认构造 v
后执行 for (InputIt s = begin; s != end; ++s)
v
.push_back(modseed(*s));,其中 mod_seed(x)=x mod 232。
如果 std::iterator_traits<InputIt>::value_type 不是整数类型,那么程序非良构。
如果
InputIt
不满足老式输入迭代器 (LegacyInputIterator) 的要求,那么行为未定义。 此重载只有在
T
是整数类型时才会参与重载决议。参数
begin, end | - | 表示初始种子序列的迭代器对 |
il | - | 初始种子序列 |
示例
运行此代码
#include <iterator> #include <random> #include <sstream> int main() { std::seed_seq s1; // 可默认构造 std::seed_seq s2{1, 2, 3}; // 能用列表初始化 std::seed_seq s3 = {-1, 0, 1}; // 列表初始化的另一种形式 int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::seed_seq s4(a, a + 10); // 能用迭代器 std::istringstream buf("1 2 3 4 5"); std::istream_iterator<int> beg(buf), end; std::seed_seq s5(beg, end); // 即使是流输入迭代器 }
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2180 | C++11 | 所有构造函数都不会抛出异常 | 只有重载 (1) 不会抛出异常 |
LWG 3422 | C++11 | 1. 重载 (1) 不是 noexcept 2. 重载 (4) 没有被约束 | 1. 使之为 noexcept 2. 添加约束 |