2013-01-04 10 views
5
struct A 
{ 
    enum InnerEnum { X }; 

    A(InnerEnum x) 
    {} 
}; 

int main() 
{ 
    A a(X); 
} 

Kompilator narzeka: error C2065: 'X' : undeclared identifierDlaczego C++ 11 nie obsługuje wyszukiwania nazw w ten sposób?

Kompilator wie, jaki typ parametr konstruktora jest, więc kiedy mijam X jako argumentu, kompilator powinien wiedzieć, że jest to ważny argument.

Wiem, że to nie jest ADL (nazwisko zależne od nazwiska, znane również jako Koenig Lookup), ale myślę, że jest użyteczny i bardzo przydatny. Ponieważ nie muszę pisać w następujący sposób:

A a(A::X); 

Myślę, że reguła ADL powinna być uogólniona do takiego przypadku.

Mam rację?

+2

Jest to odwrotność ADL ... FDL (wyszukiwanie zależne od funkcji). –

+9

Czy zastanawiałeś się, w jaki sposób miałoby to zastosowanie, gdy masz również zmienną lokalną o nazwie "X"? I bez względu na sposób, w jaki czytam twoje pytanie, mówisz, że jest to nieprawidłowe C++ i pytasz, czy standard C++ powinien się zmienić. To złe miejsce. – hvd

+0

Dzięki, hvd. Dałeś nam przekonujące uzasadnienie. – xmllmx

Odpowiedz

10

Wywołania funkcji w C++ podlegają rozładowaniu funkcji. Rozdzielczość przeciążenia zależy od typów argumentów. To znaczy. język "działa" konkretnie w tym kierunku: od typy argumentów do określona wersja funkcji o podanej nazwie.

Proponujesz wprowadzenie procesu odwrotnego - dedukcja typu argumentu na podstawie nazwy funkcji. To nie zadziała w ogólnym przypadku. Może działać w przypadkach, gdy istnieje tylko jedna funkcja kandydata (jak w twoim przykładzie), ale znowu jest sprzeczna z zasadami, które działają w ogólnej sytuacji, gdy funkcja jest przeciążona.

Oczywiście sytuacja będzie jeszcze bardziej skomplikowana, gdy nazwisko na niewykwalifikowanej nazwie X może zobaczyć coś innego o nazwie X oprócz Twojego A::X. Myślę, że łatwo może być bardzo sprzeczne z intuicją.

+0

Rozumiem argumenty dotyczące złożoności, które mają zastosowanie ogólnie. Być może nie ogólnie, ale z jakiegoś powodu uważam, że byłoby to szczególnie przydatne w przypadku "wyrażeń". Ponieważ często służą one jako arbitralnie nazwane opcje dla funkcji. – alfC

4

Myślę, że zasada ADL powinna być uogólniona do takiego przypadku.

Nie, dziękuję.

C++ ma swój udział (nieprzyjemne) niespodzianki (jaki inny język wymaga explicit jako słowa kluczowego?), A nie widzę wystarczającej zasługi w twoim przykładzie, aby dodać do tej listy nieoczekiwanych reguł językowych kod w nieoczekiwanych sytuacjach.

Jeśli uznasz, że dodatkowe pisanie związane z klasą i dwoma dwukropkami to zbyt wiele wysiłku, to z pewnością ogólna barokowa natura składni C++ powinna już cię zniechęcić?

Powiązane problemy