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