2013-06-02 13 views
7

Aşağıdaki kodu: içindeNeden C++ 11 işaretçi-için-üye niteliksiz eleman fonksiyonu adından alamıyor?

struct X 
{ 
    void f() {} 

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

sonuçları:

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’ 

Sorum şu, neden buna izin ve standardına göre yasak değil? Bir kullanıcı niteliksiz buna bakmaya olarak daha uygun olacağını, bu yüzden başka bir gerekçe (emniyet? Bir belirsizlik? Derleyici uygulama kolaylığı?) Bondaj için varsayıyorum?

+0

Bu, bir önceki cevabı soruyu ele almak görünüyor: http://stackoverflow.com/a/7138582 –

cevap

6

işaretçi-için-üye özel muamele ve mutlaka en ekonomik birini sağlayacak kadar nadirdir. Sadece kabul edilen formun hata mesajında ​​belirtilen şekli olduğuna karar verildi. Bu form hiçbir koşulda başka bir şeyle çatışmaz. Ve daha fazla lax formlarının belirsizliğini önler.

Uygulama, PTMF'lerin farkında olmadıklarını ve temel olarak fonksiyonlardan ayrıldıklarını göstermektedir. f veya & f, muhtemelen normal bir işlev için bir istektir. Statik olmayan bir üye için sunulamayacak biri. Ve aslında PTMF'yi kastedenler & X :: parçasını ekliyorlar.

+1

aşağıdaki soran kaba olmak istemem - ama cevabınız spekülatif mi? ya da bunun kararın ardındaki mantık olduğunu doğrudan biliyor musunuz? –

+1

tamamen spekülatif değil. Aynı soruyu 10 yıldan daha önce comp.std.C++ 'da benzer bir soruyu ilk kez karşı karşıya getirerek sordum. (MSVC5'ten gcc'ye geçiş yapan IIRC kodu daha seçici olmuştur). İnsanlardan aldığım cevapların en iyi hatırı sayılır, çoğunlukla WG21 ile çalışıyor. Bu iş parçacıklarından birini kazmaya çalışabilirsiniz. –

0

Bir işlev değil, bir üye işlevinin adresini alıyorsunuz, bu da farklı olarak adlandırmanız gerektiği anlamına gelir.

struct X 
{ 
    void f() {} 

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

üretir:

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