表达式是在decltype中执行,还是只是检查验证?

All*_*nzi 6 c++ templates sfinae c++11

通过使用Expression SFINAE,您可以检测是否支持某些操作员操作.

例如,

template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
 { t.reserve(n); }
Run Code Online (Sandbox Code Playgroud)

我的问题是t.reserve(n)内部decltype被执行与否?

如果是,这是否意味着t.reserve(n)执行了两次,一次在内部decltype,另一次在函数体内?

如果没有,是否只是在编译期间检查验证?但是为什么它没有被执行,我认为逗号分隔表达式列表中的所有表达式都将被执行.

Bar*_*rry 14

不,来自[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()将被调用一次(在函数体中).如果不是,那么我们有替换失败,并且该函数不是可行的超载候选者.

  • @Allanqunzi没人提前知道.在某些时候,每个人都不知道. (6认同)