在为这个问题编写测试代码时,我发现下面的注释行不能在 GCC 4.7.2 上编译:
#include <thread>
#include <iostream>
struct S {
void f() {
std::cout << "Calling f()" << std::endl;
}
};
int main()
{
S s;
// std::thread t(&S::f, s); // does not compile?
std::thread t(&S::f, &s);
t.join();
}
但是 cppreference 似乎声称“this”参数可以等效地作为对象、对对象的引用或指向对象的指针传递:
如果 f 是指向类 T 的成员函数的指针,则调用它。返回值被忽略。实际上,执行以下代码: (t1.*f)(t2, ..., tN) 如果 t1 的类型是 T,则引用 T 或引用派生自 T 的类型。 ((*t1).* f)(t2, ..., tN) 否则。
我实际上认为这听起来很糟糕,并且宁愿std::thread
只允许指针或引用语义而不是互换地接受它们,但鉴于它似乎应该这样做,以上是 GCC/libstdc++ 错误(还是我误解了 cppreference)?