c – 是否执行了decltype中的表达式,或只是检查验证?

通过使用Expression SFINAE,您可以检测是否支持某些operatoroperation.

例如,

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)是一个有效的表达式.如果是,则该函数是一个可行的重载,其返回类型为void,而reserve()将被调用一次(在函数体中).如果不是,那么我们有替换失败,并且该函数不是可行的超载候选者.

转载注明原文:c – 是否执行了decltype中的表达式,或只是检查验证? - 代码日志