当对一个任意类型进行SFINAE时,通常需要将表达式的结果转换为void
。我见过两种做法;一种是强制转换为void:
(void)(expr) // or static_cast<void>(expr)
或者,作为另一种选择,使用逗号运算符和void prvalue RHS:
(expr), void()
据我所知,在这两种情况下,
expr
都会被评估(在非评估上下文中进行格式检查),并且结果(或结果类型,在非评估上下文中)会被丢弃;即使是一种病态类 T
,也无法覆盖 T::operator void()
或 operator,(T, void)
。 (参见:为什么使用转换语法时不调用“operator void”?,“auto f(params) -> decltype(..., void())”中的“void()”是做什么用的?)。话虽如此,这两种习惯用法是否等效,或者在任何情况下都应该优先选择其中之一(可能使用非标准编译器)?如果没有,是否有任何理由(例如可理解性)更喜欢其中之一?