[英]GCC 4.7.2: std::thread with pointer to member function
在為這個問題編寫測試代碼時,我發現下面的注釋行不能在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)?
好像今晚這是GCC Bug Party :-)
除了笑話,這肯定是一個錯誤 。 我對鏈接問題的回答實際上包含了證據,但由於沒有強調,我將在此重復。
這就是INVOKE
工具,就其中std::thread
的構造函數的行為(參見鏈接的答案)在C ++ 11標准中的定義而言
定義INVOKE(f,t1,t2,...,tN)如下:
- (t1。* f)(t2,...,tN)當f是指向類T的成員函數的指針時,t1是類型為T的對象或對類型為T的對象的引用或對t的引用源自T的類型的對象;
- ((* t1)。* f)(t2,...,tN)當f是指向類T的成員函數的指針時,t1不是前一項中描述的類型之一;
- 當n == 1時,t1。* f,f是指向類T的成員數據的指針,t1是類型為T的對象或對類型為T的對象的引用或對從中派生類型的對象的引用噸;
- (* t1)。* f當N == 1且f是指向類T的成員數據的指針時,t1不是前一項中描述的類型之一;
- 在所有其他情況下f(t1,t2,...,tN)。
粗體字的句子有效地指定了該行:
std :: thread t(&S :: f,s);
應該編譯。 因此,這有資格作為錯誤 。
此外,它在GCC 4.8.0(測試版)和Clang 3.2上進行了編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.