Quando si esegue SFINAE su un tipo arbitrario, è spesso necessario trasmettere il risultato di un'espressione a void
. Ho visto due modi per farlo; un cast a vuoto:SFINAE: 'static_cast <void>()' o ', void()'?
(void)(expr) // or static_cast<void>(expr)
O, in alternativa, utilizzando l'operatore virgola con un vuoto prvalue RHS:
(expr), void()
E 'la mia comprensione che in entrambi i casi expr
viene valutata (per ben formati, in un contesto non valutato) e il risultato (o il tipo di risultato, in un contesto non valutato) scartati; in entrambi i casi non è possibile nemmeno una classe patologica T
ignorare T::operator void()
o operator,(T, void)
. (Vedi: Why is "operator void" not invoked with cast syntax?, What does the 'void()' in 'auto f(params) -> decltype(..., void())' do?).
Detto questo, questi due idiomi equivalgono o ci sono circostanze in cui si dovrebbe preferire l'altro (eventualmente con compilatori non standard)? In caso negativo, ci sono dei motivi (ad esempio, la comprensibilità) per preferire uno rispetto all'altro?
Vorrei solo usare la notazione più breve e più chiara. Se ci dovrebbe essere qualche sottigliezza che imporrebbe l'uso dell'espressione virgola, lo userei per quel caso specifico, con un commento che spiega perché. Non riesco a pensare a una tale sottigliezza però. –