通过使用表达SFINAE https://stackoverflow.com/questions/12654067/what-is-expression-sfinae,你可以检测是否有一些operator https://stackoverflow.com/questions/5839357/detect-operator-support-with-decltype-sfinae or 手术 https://stackoverflow.com/questions/14003366/what-does-the-void-in-auto-fparams-decltype-void-do是否支持。
例如,
template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
{ t.reserve(n); }
我的问题是t.reserve(n)
inside decltype
被处决还是不被处决?
如果是的话,这是否意味着t.reserve(n)
被处决两次,一次在里面decltype
函数体内的另一个呢?
如果不是,是否只是在编译时检查验证?但为什么它没有被执行,我认为逗号分隔表达式列表中的所有表达式都会被执行。
不,来自 [dcl.type.simple]:
的操作数为decltype
说明符是一个未计算的操作数(第 5 条)。
这意味着,从 [expr] 开始:
在某些情况下,会出现未计算的操作数(5.2.8、5.3.3、5.3.7、7.1.6.2)。未评估的操作数不是
评价。未评估的操作数被视为充分表达.
所以在这个特定的背景下,目的decltype(t.reserve(n), void())
是为了验证t.reserve(n)
是一个有效的表达式。如果是,则该函数是一个可行的重载,其返回类型为 void,并且reserve()
将被调用一次(在函数体内)。如果不是,那么我们就会出现替换失败,并且该函数不是可行的重载候选者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)