decltype 中的表达式是被执行,还是只是被检查以进行验证? [重复]

问题描述 投票:0回答:1

通过使用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
内,另一次在函数体内?

如果不是,是否只是在编译时检查验证?但为什么不执行,我以为逗号分隔表达式列表中的所有表达式都会被执行。

c++ templates c++11 sfinae
1个回答
17
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.