2013-06-02 11 views
7

Poniższy kod:Dlaczego nie można uzyskać wskaźnika do członka z niekwalifikowanej nazwy funkcji elementu w C++ 11?

struct X 
{ 
    void f() {} 

    void g() 
    { 
     auto h = &f; 
    } 
}; 

skutkuje:

error: ISO C++ forbids taking the address of an unqualified 
or parenthesized non-static member function to form a pointer 
to member function. Say ‘&X::f’ 

Moje pytanie brzmi, dlaczegojest to niedozwolone i zabronione przez standard? Byłoby wygodniej, gdy użytkownik odniósłby się do niego jako niewykwalifikowany, więc zakładam, że istnieje jakieś uzasadnienie (bezpieczeństwo, niejasność, łatwość implementacji kompilatora?) W odniesieniu do wymagań.

+0

Ta poprzednia odpowiedź wydaje się odpowiedzieć na pytanie: http://stackoverflow.com/a/7138582 –

Odpowiedz

6

Wskaźnik do członka jest na tyle rzadki, że pozwala na specjalne traktowanie i niekoniecznie najbardziej ekonomiczny. Postanowiono, że jedyną akceptowaną formą jest ta cytowana w komunikacie o błędzie. Ta forma nie koliduje z niczym innym w żadnych okolicznościach. I zapobiega niejednoznaczności większej liczby niedozwolonych formularzy.

Praktyka pokazuje małą świadomość PTMF i fakt, że zasadniczo różnią się one od funkcji. f lub & f jest prawdopodobnie żądaniem normalnej funkcji. Jeden, który nie może być obsłużony dla nie-statycznego członka. A ci, którzy faktycznie mają na myśli PTMF, mówią o dodaniu części X :: &.

+1

Nie chcę być niegrzeczny, prosząc następujące - ale czy twoja odpowiedź jest spekulatywna? czy masz bezpośrednią wiedzę, że to było uzasadnienie decyzji? –

+1

nie do końca spekulacyjny. Zadałem to samo pytanie 10+ lat temu na comp.std.C++ przed podobnym problemem za pierwszym razem. (Kod portu IIRC z MSVC5 do gcc, który był bardziej wybredny). To moje najlepsze wspomnienie odpowiedzi, które otrzymałem od ludzi, głównie pracując w WG21 lub przez niego. Możesz spróbować wykopać jeden z tych wątków. –

0

Podajesz adres funkcji członkowskiej, a nie funkcji, co oznacza, że ​​będziesz musiał nazwać ją inaczej.

struct X 
{ 
    void f() {} 

    void g() 
    { 
     auto h = &X::f; 
     h(); 
    } 
}; 

Produkuje:

 
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘h (...)’, e.g. ‘(... ->* h) (...)’ 
Powiązane problemy