You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用std::queue相关方法作函数参数结果异常,是我理解有误吗?

函数参数求值顺序导致的参数顺序反转问题

问题根源

这和std::queue的用法无关,问题出在C++函数参数的求值顺序上。

在C++中,函数实参的求值顺序属于未指定行为——编译器可以自行选择任意顺序计算函数的各个实参。你的代码中wut(args.cunext(), args.cunext());的两个cunext()调用顺序由编译器决定,这里你的编译器选择了从右往左的求值顺序:

  1. 先计算右侧的args.cunext():取出队列头部的1,然后弹出它
  2. 再计算左侧的args.cunext():此时队列头部是2,取出并弹出
    最终两个参数的值就变成了2和1,导致输出顺序反转。

即便在C++17及之后的标准中,函数实参的求值顺序依然没有强制统一规则,因此永远不要依赖函数实参的求值顺序编写逻辑。

代码优化建议

你的Args构造函数可以简化得更直观:

Args::Args(int argc, char* argv[]):
    q_args()
{
    // 直接跳过argv[0],遍历所有传入的参数
    for (int i = 1; i < argc; ++i)
    {
        q_args.push(argv[i]);
    }
};

原写法*(++argv)虽然能运行,但指针操作容易混淆索引关系,改用argv[i]更易读。

解决方法

要保证参数顺序正确,需显式控制cunext()的调用顺序,先将结果存入变量再传递给函数:

int main(int argc, char* argv[])
{
    Args args(argc, argv);
    std::string first = args.cunext();
    std::string second = args.cunext();
    wut(first, second);
    return 0;
}

这样就能确保先调用第一个cunext()取出1,再调用第二个取出2,参数顺序完全符合预期。

内容的提问来源于stack exchange,提问作者Prenom Nom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:58:27