Podczas wykonywania SFINAE na dowolnym typie, często konieczne jest rzutowanie wyniku wyrażenia na void
. Widziałem dwa sposoby robienia tego; oddanych do unieważnienia:SFINAE: 'static_cast <void>()' lub ', void()'?
(void)(expr) // or static_cast<void>(expr)
albo, alternatywnie, za pomocą operatora przecinek w pustce prvalue RHS:
(expr), void()
To moja zrozumienie, że w obu przypadkach expr
jest oceniany (dla sensowności, w kontekst nieoceniony) i odrzucono wynik (lub typ wyniku, w kontekście nieocenionym); w obu przypadkach nie jest możliwe, aby nawet klasa patologiczna T
nadpisała T::operator void()
lub operator,(T, void)
. (Zobacz: Why is "operator void" not invoked with cast syntax?, What does the 'void()' in 'auto f(params) -> decltype(..., void())' do?).
To powiedziawszy, czy te dwa idiomy są równoważne, czy są jakieś okoliczności, w których jeden powinien być preferowany względem drugiego (być może z niestandardowymi kompilatorami)? Jeśli nie, to czy istnieją jakieś powody (np. Zrozumiałość), aby preferować jeden z drugim?
Po prostu użyłbym najkrótszej i najbardziej przejrzystej notacji. Gdyby istniała jakaś subtelność, która wymuszałaby użycie wyrażenia przecinka, użyłbym tego w tym konkretnym przypadku, z komentarzem wyjaśniającym dlaczego. Nie mogę sobie jednak wyobrazić takiej subtelności. –