通过使用 Expression SFINAE ,您可以检测是否支持某些 operator 或 operation 。
例如,
template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
{ t.reserve(n); }
我的问题是
t.reserve(n)
中的 decltype
是否被执行?如果是,那是否意味着
t.reserve(n)
被执行了两次,一次在 decltype
中,另一次在函数体中?如果没有,它是否只是在编译时检查验证?但是为什么不执行,我认为逗号分隔的表达式列表中的所有表达式都会被执行。
最佳答案
不,来自 [dcl.type.simple]:
这意味着,来自 [expr]:
所以在这个特定的上下文中,decltype(t.reserve(n), void())
的目的是验证 t.reserve(n)
是一个有效的表达式。如果是,则该函数是一个可行的重载,其返回类型为 void,并且 reserve()
将仅被调用一次(在函数体中)。如果不是,那么我们就会出现替换失败并且该函数不是可行的重载候选者。