2009-02-27 36 views
11

Czy ktoś może mi powiedzieć, co ta obsada ma dla efektu (poza ustawieniem happyNumber do 1337), jeśli w ogóle, i jeśli nie ma żadnego innego efektu, to dlaczego mogę napisać taki kod ??? Czy jest to błąd kompilatora, czy jakaś "ukryta funkcja" C++?Co się dzieje z static_cast z wieloma argumentami?

int happyNumber = static_cast<int>(123.456, TRUE, "WTF" , false , "IS" , NULL , "GOING" , 0xff , "ON???" , 1337); 

Byłem zaskoczony, że to skompiluje się w ogóle. Znalazłem to poprzez błąd, w którym przypadkowo ustawiłem drugi parametr na coś, co miało przejść w wywołanie funkcji wyrażenia, które jest rzutowane. Spowodowało to nieprzyjemny błąd, gdy obiekt został rzucony z drugiego parametru, wywołując funkcję tylko z jednym argumentem. To skompilowany ... I początkowo nie bom ...

używam Microsoft Visual C++ 2008.

+0

To całkowicie legalne i nie ma błędów. – Anonymous

+0

Ach, tak, masz rację. To było tak dezorientujące, że wiedziałem, * że musi to być błąd kompilatora - którego nie było :) Nigdy wcześniej nie wpadłem na operatora przecinka. – Statement

Odpowiedz

30

Static obsada przyjmuje jeden argument, ale jej argument jest wyrażeniem, a wyrażenia mogą obejmować comma operator. Przecinek jest stosowany w sytuacjach, gdy chcesz ocenić dwa lub więcej wyrażeń na raz za ich skutki uboczne, np:

int i, j; 
for (i=0, j=0; i < 10; i++,j++) { 
    // do stuff 
} 

To dość przydatne, ponieważ bez niego można tylko oceniać jeden wyraz każdy za inicjatora, stanu i kontynuuj części pętli for (lub każdego innego miejsca, w którym oczekiwane jest wyrażenie). Zwykle jednak nie robi się najczystszego kodu, a semantyka jest dziwna. Jak zauważyłeś, sekwencja oddzielona przecinkami ocenia na wartość swojego ostatniego wyrażenia.

+0

Rozumiem użycie dla niego w składni, ale nie mogę uchwycić funkcjonalność w static_cast. – Statement

+0

Brak funkcji. Po prostu wykonujesz operacje przy użyciu operatora przecinka i rzutujesz wynik. – Anonymous

+0

Ach, dzięki tobie i Ruben I teraz zrozumieć, jak to działa, i dowiedział się czegoś nowego :) – Statement