【发布时间】:2021-05-25 00:33:18
【问题描述】:
我有两个功能
void f(const int &x) {}
void g(int& x) {}
我可以做
int x = 0;
std::thread t1(f, x);
但我无法创建std::thread t2(g, x),在这种情况下我需要创建std::ref(x) 而不是只创建x,为什么需要?
为什么可以在没有std::cref 的情况下创建t1?
【问题讨论】:
-
你得到的错误信息到底是什么?
-
std::thread将参数复制到函数中。std::ref将您的对象包装在std::reference_wrapper中,它授予引用语义,因此副本引用原始对象。 -
好的,我明白了。但是为什么没有
std::cref就可以成功创建t1呢? -
所有涉及参数的类型信息在C++中都很重要。请写出显示问题的可编译示例。从这个
std::thread t1(f, x)无法分辨,因为我们不知道f或x是什么! -
完整代码ideone.com/KjOIKc。当我将
int更改为任何类型时,它也有效。为什么它可以编译并且不需要通过std::cref传递x?
标签: c++ multithreading pass-by-reference stdthread pass-by-const-reference