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()
将被恰好调用一次(在函数体中)。如果不是,那么我们有一个替换失败并且该函数不是一个可行的重载候选者。
是否支持使用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()
将被恰好调用一次(在函数体中)。如果不是,那么我们有一个替换失败并且该函数不是一个可行的重载候选者。