簡體   English   中英

將對象指針作為成員函數的第一個參數傳遞:它是標准的嗎?

[英]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用於轉換為Rfunction的返回類型):

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.

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