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

时间:2017-04-13 13:00:38

标签: 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 个答案:

答案 0 :(得分:1)

你不能。

显然标准没有看到使其可复制的理由,因为它只是从小输入生成适当的种子序列的临时对象。为什么它不可移动有点可疑,但可能答案与推文的推理相同。

但是有一些解决方法:

  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之前对种子做些什么。为调试目的将它们设置为具体值。