我对构造std::thread对象的细节很感兴趣(并对此感到困惑)。根据cppreference,线程函数和所有参数都被值复制到一些线程可访问的存储中,然后调用。
1)这个线程可访问的存储究竟是什么?是不是语义上等同于某种线程本地存储,在线程函数返回后销毁变量?
2) 传递给线程函数时参数的值类别是什么?cppreference 上的描述表明它们作为左值传递(无论如何它们都被赋予了名称)。我对 GCC 和 clang 的测试似乎表明相反,即 r 值。具体来说,以下代码无法编译:
void f(int& a) {
  std::cout << ++a << '\n';
}
int main() {
    std::thread t(&f, 1);
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我们f改为
void f(int&& a) {
  std::cout << ++a << '\n';
}
int main() {
    std::thread t(&f, 1);
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
那么,标准对此有何看法?