簡體   English   中英

指向std :: invoke中成員函數對象的指針

[英]Pointer to member function-object in std::invoke

為什么std :: invoke不能使用指向成員的指針,該成員是帶參數的函數對象? 像這樣:

struct MyClass
{
    std::function<void(int)> functor{ [](int arg) { printf("%d\n", arg); } };
};
int main()
{
    MyClass mc;
    std::invoke(&MyClass::functor, mc, 110);
}

打印: 'std::invoke': no matching overloaded function found. 我在Visual C ++和g ++中檢查過這個。

而且, std::is_invocable_v<decltype(&MyClass::functor), MyClass, int>聲稱這個仿函數不可調用,這絕對是錯誤的。 我錯過了什么或者它是標准中的缺陷嗎? 如果這種行為是正確的,那么std :: invoke及其所有朋友的觀點是什么? 我的意思是簡單的函數對象可以很容易地調用,沒有任何設施,但我雖然std :: invoke的主要目的是概括和簡化所有callables的工作,包括棘手的,如指向成員的指針。 std :: invoke無法調用一個明確可調用的目標的事實對我來說似乎很奇怪。

問題是functor不是函數,而是數據成員。 因此, &MyClass::functor不是指向成員函數的指針,而是指向成員數據的指針。 這種區別意味着你不能將任何其他參數傳遞給std::invoke ,因為你不能調用數據成員; 但是對於一些數據成員,就像你的functor一樣。 在C ++ 11之前,標准尚不清楚,因此有LWG問題1520在C ++ 11中合並。

我的意思是你可以將你的例子重寫為:

std::invoke(&MyClass::functor, mc)(110);
// or for maximum confusion
std::invoke(std::invoke(&MyClass::functor, mc), 110);

但我不認為這就是你想要的。 感謝Barry ,這是一個壞主意,正如以下代碼所做的那樣:

struct X {
  std::function<void()> f;
};
std::invoke(&X::f, x); // gets f, or calls f?

獲取f會使其與其他數據成員保持一致,但如果f不帶參數,則無法調用f 調用f意味着當您只想獲取它們時,您會與其他數據成員不一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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