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

例如,

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() 将仅被调用一次(在函数体中)。如果不是,那么我们就会出现替换失败并且该函数不是可行的重载候选者。

10-08 09:44