c++ - 如何从函数返回 std::seed_seq 对象

标签 c++ c++11

如何编写函数返回 std::seed_seq 对象?

下面的代码不起作用。

std::seed_seq f(){
    return {0};
}

std::seed_seq s = f();  /* error C2280: 
                           'std::seed_seq::seed_seq(const std::seed_seq &)':
                           attempting to reference a deleted function
                         */

最佳答案

你不能。

显然,标准没有看到使其可复制的理由,因为它只是一个临时对象,用于从小输入中生成正确的种子序列。为什么它不可移动有点值得怀疑,但答案可能与拷贝的推理框架相同。

但是有一些解决方法:

  1. 使用堆,即返回指向种子序列的指针:

    auto seq = std::make_unique<std::seed_seq> (/*...*/);
    // ...
    return seq;
    
  2. 生成后,无需返回 std::seed_seq 对象本身,只需将其内容复制到另一个存储中即可。

    std::seed_seq seq (/*...*/);
    // ...
    std::vector<std::seed_seq::result_type> seeds (seq.size ());
    seq.param (seeds.begin ());
    
  3. 相反。将输入存储到 std::seed_seq 中。这就是我最后所做的。您是否保留已存储的内容或将要存储的内容并没有真正的区别 - 标准保证了这一点。只是您可以决定在将种子传递给 std::seed_seq 之前对它们进行一些操作,例如将它们设置为具体值以进行调试。

关于c++ - 如何从函数返回 std::seed_seq 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43393052/

相关文章:

c++ - 使用 Gloox C/C++ 的 XMPP 握手流程

c++ - 忽略模板参数

c++ - 类型特征优化

c++ - 如何使用动态指针和智能指针更改变量的值?

c++ - 在没有任何干预的情况下继续运行程序,直到它被要求退出

c++ - OSX "ld": how to show mangled names of unresolved symbols? 如何获取 map 文件?

c++ - C++ 中的关联键到键映射

c++ - 不完整的类型错误

c++ - CUDA *.obj 文件不被 Visual Studio 链接器处理

c++ - 删除类成员的动态分配的内存的最佳方法是什么