decltype 中的表达式是否被执行,或者只是被检查以进行验证?

Is expression inside decltype executed, or just being checked for validation?

是否支持使用Expression SFINAE, you can detect if some operator or operation

例如,

template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
 { t.reserve(n); }

我的问题是 decltype 中的 t.reserve(n) 是否被执行?

如果是,是否意味着 t.reserve(n) 被执行了两次,一次在 decltype 中,另一次在函数体内?

如果不是,是否只是在编译时检查验证?但是为什么不执行,我以为逗号分隔的表达式列表中的所有表达式都会被执行。

否,来自[dcl.type.simple]:

The operand of the decltype specifier is an unevaluated operand (Clause 5).

这意味着,从 [expr]:

In some contexts, unevaluated operands appear (5.2.8, 5.3.3, 5.3.7, 7.1.6.2). An unevaluated operand is not evaluated. An unevaluated operand is considered a full-expression.

所以在这个特定的上下文中,decltype(t.reserve(n), void()) 的目的是验证 t.reserve(n) 是一个有效的表达式。如果是,则该函数是一个可行的重载,其 return 类型为 void,并且 reserve() 将被恰好调用一次(在函数体中)。如果不是,那么我们有一个替换失败并且该函数不是一个可行的重载候选者。