Dlaczegoż w takim przykładzie trzeba użyć std::ref
?
void func_1(int& x)
{
while (true)
{
std::cout << "func_1 x value : " << x << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
std::thread thread_1(func_1, std::ref(x));
albo w takim przykładzie, tez działa poprawnie tylko parametr std::ref(n2)
a nie działa n1
#include <functional>
#include <iostream>
void f(int& n1, int& n2, const int& n3)
{
std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n'
<< "&n1 = " << &n1 << '\n'
<< "&n2 = " << &n2 << '\n'
<< "&n3 = " << &n3 << '\n';
++n1; // increments the copy of n1 stored in the function object
++n2; // increments the main()'s n2
// ++n3; // compile error
}
int main()
{
int n1 = 1, n2 = 2, n3 = 3;
std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
n1 = 10;
n2 = 11;
n3 = 12;
std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
bound_f();
std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n'
<< "&n1 = " << &n1 << '\n'
<< "&n2 = " << &n2 << '\n'
<< "&n3 = " << &n3 << '\n';
}