![](/img/trans.png)
[英]Passing a pointer to a member function as argument for a void* function
[英]Passing object pointer as first argument for a member function: is it standard?
下面的程序用gcc和clang編譯,但這實際上是標准的C ++ 11還是兩個編譯器都選擇支持它以方便使用?
struct Foo {
int i;
void bar() { std::cout << i << std::endl; }
};
int main() {
std::function<void(Foo*)> method = &Foo::bar;
Foo myFoo{4};
method(&myFoo); // prints 4
}
這當然很方便,但我不明白它是如何工作的。
是的,這是標准的。 [func.wrap.func.inv]指定operator()(ArgTypes&&... args)
std::function
調用
INVOKE
(f, std::forward<ArgTypes>(args)..., R)
(20.8.2),其中f
是*this
的目標對象(20.8.1)。
(其中R
是指定的返回類型。)
[func.require]定義了INVOKE
:
定義
INVOKE
(f, t1, t2, ..., tN)
如下:
(t1.*f)(t2, ..., tN)
當f
是指向類T
的成員函數的指針時,t1
是類型為T
的對象或對類型為T
的對象的引用或對類型T
的引用源自T
的類型的對象;
((*t1).*f)(t2, ..., tN)
當f
是指向類T
的成員函數的指針時,t1
不是前一項中描述的類型之一;- [...]
請注意,調用中的尾隨R
用於轉換為R
( function
的返回類型):
將
INVOKE
(f, t1, t2, ..., tN, R)
INVOKE
(f, t1, t2, ..., tN, R)
為隱式轉換為R
INVOKE
(f, t1, t2, ..., tN)
。
你給出的第一個也是唯一一個參數是指向Foo
-object的指針。 對method
的調用因此導致調用(void)((*t1).*f)()
,當用您給定的值寫入時,相當於
((*(&myFoo)).&Foo::bar)()
,相當於myFoo.bar()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.