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

如何将右值std::vector传递给接收std::span的函数?

用std::vector右值调用接收std::span的函数的解决方法

当你尝试用std::vector的右值临时对象调用接收std::span的函数时,会遇到编译错误。例如这段代码:

void foo(std::span<int> s);

std::vector<int> make_vector();

int main() {  
  foo(make_vector()); // 编译失败
}

对应的错误信息为:

候选函数不可行:第一个参数无法从std::vector转换为std::span

这是标准库的刻意设计——禁止std::vector右值隐式转换为std::span,防止因临时对象销毁导致span悬垂。但在当前场景中,临时vector的生命周期完全覆盖foo的执行过程,操作是安全的,只是编译器默认不允许这种转换。

以下是几种可行的单行解决方案:

  • 显式转换为const左值引用
    利用const左值引用可绑定右值的特性,让std::span正常构造:

    foo(static_cast<const std::vector<int>&>(make_vector()));
    

    C++17及以上版本可以用更简洁的std::as_const:

    foo(std::as_const(make_vector()));
    
  • 通过lambda复用临时对象构造span
    用lambda接收右值引用,避免重复创建临时vector,手动构造span:

    foo([](auto&& vec) { return std::span<int>{vec.data(), vec.size()}; }(make_vector()));
    
  • 自定义辅助函数
    写一个通用模板函数,专门从右值容器生成span,方便复用:

    template <typename Container>
    constexpr std::span<typename Container::value_type> as_span(Container&& c) noexcept {
        return {c.data(), c.size()};
    }
    
    // 调用方式
    foo(as_span(make_vector()));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:41:13