2016-03-31 3 views
1

ここに私のコードです: 結果は1,2,3,4,5,6でなければなりませんが、まだ1,2,3,1,2,3です.Linuxで動かすと正しいです。誰が私に真実を伝えることができます。ファンクタを参照して渡します。私はVS2012で実行しますが、なぜエラーが発生しますか?

class IntSequence { 
private: 
    int value; 
public: 
    IntSequence(int initialValue) : value(initialValue){} 
    int operator()() { 
     return value++; 
    } 
}; 
int main() 
{ 

    list<int> coll; 
    IntSequence seq(1); 
    generate_n<back_insert_iterator<list<int> > , int , IntSequence& > 
     (back_inserter(coll) , 3 ,seq);//result is 1,2,3 
    generate_n (back_inserter(coll) , 3 ,seq);//result should be 1,2,3,4,5,6,but it is still 1,2,3,1,2,3 
} 

答えて

3

使用std::ref、そうでない場合generate_nは、新しいIntSequenceファンクタを作成し、それが価値だ増加し、それを破壊します。それはVisual Studioで動作しない理由を

http://ideone.com/pBHum1

list<int> coll; 
IntSequence seq(1); 

generate_n (back_inserter(coll), 3, std::ref(seq)); 
generate_n (back_inserter(coll), 3, std::ref(seq)); 

for (auto& i : coll) 
    cout << i << " "; 

説明:

VS2015で

(とあなたのケース2012年)、generate_n内部プライベート関数_generate_n、受け入れない呼び出します転送参照、または参照をまったく必要としません。代わりに、値によって_Fnを再び受け取ります。

実際にテンプレート引数を明示的に設定して参照を正しく渡しても、_generate_nという次の呼び出しで参照が渡されます。

これがこのように意図されているかどうかわかりません。しかし、おそらくそれは理由であるので、std::reference_wrapperが最初に存在しているからです。

+0

@songyuanyaoこれは現在、このコードをvs –

+0

と組み合わせて使用​​しています。@songyuanyao私は自分の答えを更新しました。これがバグかどうかわかりません。 – Jts

+0

OK、ありがとう –

関連する問題