指针(*)和参考(&)之间的差异

时间:2015-10-29 13:13:04

标签: 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;
}

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

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

int main() {

    int n = 0;
    Func3(n);
    cout << “n = ” << n << endl; // n = 10
}

1 个答案:

答案 0 :(得分: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));

这会保留指向副本的指针,并且仅在绑定引用参数时解析为实际目标。