簡體   English   中英

GCC 4.7.2:帶有成員函數指針的std :: thread

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM