Wenn SFINAE für einen beliebigen Typ ausgeführt wird, muss das Ergebnis eines Ausdrucks oft in void
umgewandelt werden. Ich habe zwei Möglichkeiten gesehen, dies zu tun; ein gegossenes ungültig zu erklären:SFINAE: 'static_cast <void>()' oder ', void()'?
(void)(expr) // or static_cast<void>(expr)
Oder alternativ den Komma-Operator mit einem Hohlraum prvalue RHS mit:
(expr), void()
Es ist mein Verständnis, dass in beiden Fällen expr
(für Wohlgeformtheits- ausgewertet wird, in ein nicht evaluierter Kontext) und das Ergebnis (oder der Ergebnistyp in einem nicht evaluierten Kontext) verworfen wird; es ist in keinem Fall möglich, selbst eine pathologische Klasse T
zu überschreiben T::operator void()
oder operator,(T, void)
. (Siehe: Why is "operator void" not invoked with cast syntax?, What does the 'void()' in 'auto f(params) -> decltype(..., void())' do?).
Das heißt, sind diese beiden Idiome gleichwertig, oder gibt es irgendwelche Umstände, unter denen man dem anderen vorzuziehen ist (möglicherweise mit Nichtstandard-Compilern)? Wenn nicht, gibt es irgendwelche Gründe (z. B. Verständlichkeit), einander vorzuziehen?
Ich würde nur die kürzeste und klarste Notation verwenden. Wenn es eine Subtilität geben sollte, die die Verwendung des Komma-Ausdrucks erzwingen würde, würde ich das für diesen speziellen Fall verwenden, mit einem Kommentar, der erklärt, warum. Ich kann mir keine solche Subtilität vorstellen. –