この質問のテスト コードを書いているときに、以下のコメント行が 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
ポインターまたは参照セマンティクスを交換可能に受け入れるのではなく、どちらか一方のみを許可することを好みます.