При выполнении SFINAE на произвольном типе часто бывает необходимо передать результат выражения в void
. Я видел два способа сделать это; литая к мочеиспусканию:SFINAE: 'static_cast <void>()' or ', void()'?
(void)(expr) // or static_cast<void>(expr)
Или, в качестве альтернативы, используя оператор запятая с пустотой prvalue РИТ:
(expr), void()
Это мое понимание того, что в обоих случаях expr
оценивается (для оформленности, в не оцениваемый контекст), а результат (или тип результата в неоцениваемом контексте) отбрасывается; это невозможно в любом случае даже для патологического класса T
для переопределения T::operator void()
или operator,(T, void)
. (См .: Why is "operator void" not invoked with cast syntax?, What does the 'void()' in 'auto f(params) -> decltype(..., void())' do?).
Сказано, что эти два идиома эквивалентны, или существуют ли какие-либо обстоятельства, при которых предпочтение следует отдавать другому (возможно, с нестандартными компиляторами)? Если нет, есть ли какие-либо причины (например, понятность), чтобы они предпочитали друг друга?
Я бы использовал кратчайшие и самые четкие обозначения. Если должна быть какая-то тонкость, которая заставит использовать выражение для запятой, я бы использовал это для этого конкретного случая с комментарием, объясняющим, почему. Хотя я не могу придумать такую тонкость. –