gpt4 book ai didi

c++ - decltype 中的表达式是否被执行,或者只是被检查以进行验证?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:58 24 4
gpt4 key购买 nike

通过使用 Expression SFINAE ,你可以检测是否有一些 operatoroperation是否支持。

例如,

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

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

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

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

最佳答案

不,来自 [dcl.type.simple]:

The operand of the decltype specifier is an unevaluated operand (Clause 5).

这意味着,来自 [expr]:

In some contexts, unevaluated operands appear (5.2.8, 5.3.3, 5.3.7, 7.1.6.2). An unevaluated operand is not evaluated. An unevaluated operand is considered a full-expression.

所以在这个特定的上下文中,decltype(t.reserve(n), void()) 的目的是验证 t.reserve(n) 是一个有效的表达。如果是,则该函数是一个可行的重载,其返回类型为 void,并且 reserve() 将被恰好调用一次(在函数体中)。如果不是,那么我们有一个替换失败并且该函数不是一个可行的重载候选者。

关于c++ - decltype 中的表达式是否被执行,或者只是被检查以进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32231075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com