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

C++中Queue接口push方法:传值还是右值引用?

定义C++ Queue抽象接口的方案选择

需求背景

之前讨论C++传值与右值引用传递的问题中,现有答案存在不完善和错误之处。我需要定义一个Queue抽象接口,满足以下要求:

  • Queue是基于存储对象类型的模板类
  • 支持存储不可拷贝类型
  • 可拥有多种实现方式
  • 若能避免拷贝,实现不应被剥夺该机会

同时,接口要体现调用Queue<T>::push(value)是将value“转移”至队列的意图,“转移”的定义为:

  1. Queue::push可对value执行任意操作(包括修改),且不会影响用户侧
  2. 调用Queue::push后,用户使用value不会对队列产生副作用

三种可选接口方案

方案1

template<typename T>
class Queue {
public:
   virtual void push(const T& value) = 0;
};

方案2

template<typename T>
class Queue {
public:
   virtual void push(T&& value) = 0;
};

方案3

template<typename T>
class Queue {
public:
   virtual void push(T value) = 0;
};

对C++核心指南的疑问

C++核心指南相关条目未能提供有效帮助:

  • F.16指出“对于‘输入’参数,廉价拷贝类型传值,其他类型传const引用”,但这要求T可拷贝,属于不必要限制,比如无法向push传递std::unique_ptr
  • F.18指出“对于‘将被移动’的参数,传X&&并使用std::move转移参数”,首先何为“将被移动”的参数并不明确;其次,作为接口定义者,我无法预知实现会移动还是不移动对象

各方案的优缺点分析

  • 方案1:无法体现正确语义,使用时std::unique_ptr<int> ptr; queue.push(std::move(ptr));无法运行,但本应可行
  • 方案2:语义正确,但强制用户显式移动或拷贝值,限制了std::shared_ptr<int> ptr; queue.push(ptr);这类合理代码
  • 方案3:支持推送值的拷贝或“移入”值,std::shared_ptr<int> ptr; queue.push(ptr);和std::unique_ptr<int> ptr; queue.push(std::move(ptr));均有效,符合所需语义,但用户可能调用Storage<std::vector<int>>::store(veryLargeVector)导致不必要的大拷贝

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:47:32