#include <iostream>
#include <random>
int main() {
std::random_device rd;
unsigned int res1 = rd(); //rd有()运算符重载,可以直接调用
std::vector<unsigned int> seeds1(30);
std::generate(seeds1.begin(), seeds1.end(), rd); //直接传递对象会发生值拷贝,对rd对象进行拷贝然后传递副本过去,但此处会报错!!!
}报错原因是random_device类没有拷贝构造,只有空构造和传入一个string这二种构造函数
系统想拷贝rd,但是没有实现(也没有默认实现)拷贝构造
_EXPORT_STD class random_device { // class to generate random numbers (from hardware where available)
public:
using result_type = unsigned int;
random_device() = default;
explicit random_device(const string&) noexcept /* strengthened */ {}
_NODISCARD static constexpr result_type(min)() noexcept /* strengthened */ {
return 0;
}
_NODISCARD static constexpr result_type(max)() noexcept /* strengthened */ {
return static_cast<result_type>(-1);
}
_NODISCARD double entropy() const noexcept {
return 32.0;
}
_NODISCARD result_type operator()() {
return _Random_device();
}
random_device(const random_device&) = delete;
random_device& operator=(const random_device&) = delete;
};看源码的倒数第二和倒数第三行,明确移除了拷贝构造和拷贝赋值运算符,所以报错是:
无法引用 函数 "std::random_device::random_device(const std::random_device &)" (已声明 所在行数:5643,所属文件:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\random") -- 它是已删除的函数
表述的是欲调用一个已移除的函数,参数是左值引用,也就是拷贝构造
套一层std::ref
std::generate(seeds1.begin(), seeds1.end(), std::ref(rd));
//传递过去的类型是std::reference_wrapper<std::random_device>
//std::reference_wrapper<std::random_device>类型可以隐式转换为std::random_device&,传引用就不会发生拷贝了