指针(*)和参考(&)之间的区别

koo*_*121 1 c++

我在这里使用Reference(&),但a没有改变.为什么?当我使用指针(*)时,值已经改变.

int all=0; 
void call_from_thread(int & a)  
{
   a = 5;
}

int main() 
{
    thread s = thread(call_from_thread, all);
    s.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另一个程序,在这种情况下,我也使用引用(&),但值已更改.为什么线程中的值没有改变?

void Func3(int &x)
{
    x = x + 10;
}

int main() {

    int n = 0;
    Func3(n);
    cout << “n = ” << n << endl; // n = 10
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 7

std::thread构造使得在线程创建步骤及其参数的副本....普通引用没有生存之旅,和call_from_thread函数接收到副本的引用.

详细信息可在标准中找到.该thread::thread构造的行为被描述为

构造一个thread类型的对象.新的执行线程执行在构造线程中进行评估INVOKE(DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...)的调用 DECAY_COPY.

确切的定义DECAY_COPY非常复杂,但顾名思义,它忽略了引用并制作了值副本.

一个简单的解决方法是使用std::ref.

thread s = thread(call_from_thread, std::ref(all));
Run Code Online (Sandbox Code Playgroud)

这会保持指针通过副本,并且只有在绑定引用参数时才会解析为实际目标.