Bitcoin script.h中BuildScript函数疑似冗余代码问询
关于BuildScript函数中cnt判断逻辑的解析
你提到的这段Bitcoin源码里的BuildScript模板函数,确实存在逻辑问题:cnt在进入判断分支前已经执行了cnt++,导致cnt == 0这个条件永远不可能成立,这部分代码属于冗余且无效的逻辑。
问题细节
- 初始状态下
cnt被初始化为0,每个传入的参数都会触发一次lambda调用,而lambda的第一行就是cnt++。 - 第一次调用lambda时,
cnt立刻从0变成1,后续调用只会让cnt持续递增,所以cnt == 0的分支永远不会被执行,完全达不到注释里“Move or copy the first element instead”的预期效果。
修正思路
要实现注释里的意图(第一个CScript类型参数直接赋值给ret,避免插入操作),有两种可行的调整方式:
方式一:调整自增位置
把cnt++移到判断逻辑之后,确保第一次判断时cnt还是初始值0:
([&ret, &cnt] (Ts&& input) { if constexpr (std::is_same_v<std::remove_cv_t<std::remove_reference_t<Ts>>, CScript>) { if (cnt == 0) { ret = std::forward<Ts>(input); } else { ret.insert(ret.end(), input.begin(), input.end()); } } else { ret << input; } cnt++; // 移至判断逻辑之后 } (std::forward<Ts>(inputs)), ...);
方式二:修改判断条件
保留cnt++在原位置,将判断条件改为cnt == 1,对应第一次调用的场景:
([&ret, &cnt] (Ts&& input) { cnt++; if constexpr (std::is_same_v<std::remove_cv_t<std::remove_reference_t<Ts>>, CScript>) { if (cnt == 1) { // 第一次调用时cnt为1 ret = std::forward<Ts>(input); } else { ret.insert(ret.end(), input.begin(), input.end()); } } else { ret << input; } } (std::forward<Ts>(inputs)), ...);
内容的提问来源于stack exchange,提问作者user618677
相关产品推荐
相关产品推荐

