在连续调用generate_n之间不保留Functor的实例变量

Ita*_*atz 5 c++ stl functor

我使用以下结构作为STL generate_n算法的输入:

struct GenerateNumber {     
    GenerateNumber () : i(0) {}
    int operator () (void) {        
        return  i++;
    }
private:
    int i;
};
Run Code Online (Sandbox Code Playgroud)

使用此仿函数的代码示例如下:

std::vector <int> v1 (3);
std::vector <int> v2 (3);
GenerateNumber generateNumber;
std::generate_n (v1.begin (), 3, generateNumber);
std::generate_n (v2.begin (), 3, generateNumber);
Run Code Online (Sandbox Code Playgroud)

但是,结果是既包含v1又v2包含{0,1,2},而不是v2包含{3,4,5}.我已经用断点验证了GenerateNumber构造函数只被调用一次(我知道构造函数被调用的次数没有多少,但我还是检查了它).

我知道我可以通过制作i静态来解决这个问题,但我不明白这种行为.为什么i连续通话之间没有保持价值?

nos*_*sid 8

传递给生成器对象时会被复制generate_n.尝试使用std::ref,即

std::generate_n(v1.begin(), 3, std::ref(generateNumber));
std::generate_n(v2.begin(), 3, std::ref(generateNumber));
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,std::ref仅在C++ 11中可用.它在TR1中被引入std::tr1::ref,并且也可以在boost中使用boost::ref.