2017-04-13 2 views
1

関数を返す方法std::seed_seqオブジェクトを書き込むには?関数から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

これはどのコンパイラですか?ここにコンパイルするように見える(http://cpp.sh/7nfwl)。それは間違いなく[RVO](https://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – CoryKramer

+0

@CoryKramer VC++ 2017 –

+7

のためにコピー構築を呼び出すべきではありません@CoryKramerあなたのコンパイラが保証されたコピーエリジョンを使用している可能性があります.C++で利用できません。 –

答えて

0

できません。

明らかに、スタンダードは小さな入力から適切なシードシーケンスを生成するのは一時的なオブジェクトなので、コピー可能にする理由は見当たりません。なぜそれが動かないのかは少し疑わしいですが、おそらくその答えはコピーと同じ推論の枠組みの中にあるでしょう。

いくつかの回避策は、しかしあります

  1. はシード配列へのポインタを返すつまり、ヒープを使用します。代わりにstd::seed_seqオブジェクト自体を返すので、

    auto seq = std::make_unique<std::seed_seq> (/*...*/); 
    // ... 
    return seq; 
    
  2. を作成した後、単にコピーそのコンテンツを別のストアに保存します。他の方法で回る。代わりにstd::seed_seqに入力を保存してください。それは私が最後にやったことです。保存されているものを保存するか、保存するものを保存するかは、標準で保証されているかどうかの間には大きな違いはありません。シードを使って何かをすることを決めることができ、それをstd::seed_seqに渡すだけです。それらをデバッグの目的で具体的な値に設定します。

関連する問題