通过使用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]:
说明符的操作数是未计算的操作数(第 5 条)。decltype
这意味着,来自 [expr]:
在某些情况下,会出现未计算的操作数(5.2.8、5.3.3、5.3.7、7.1.6.2)。未评估的操作数不是 评价。未计算的操作数被视为完整表达式。
因此在这个特定的上下文中,
decltype(t.reserve(n), void())
的目的是验证t.reserve(n)
是一个有效的表达式。如果是,则该函数是一个可行的重载,其返回类型为 void,并且 reserve()
将被调用一次(在函数体内)。如果不是,那么我们就会出现替换失败,并且该函数不是可行的重载候选者。