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

如何直接向std::span传递值?函数传参方案咨询

问题解答

首先,直接调用p({1,2,3})会编译失败,原因是:std::span<int>(非const版本)无法直接从初始化列表构造——初始化列表对应的临时数组元素是const的,无法绑定到非const的std::span。另外即使能构造,临时数组的生命周期也不会被std::span延长,函数内访问会触发未定义行为。

下面是几种可行的安全调用方式:

1. 用std::array临时对象传递

std::array可以隐式转换为std::span<int>,且临时std::array的生命周期会延续到整个函数调用结束,访问安全:

// C++17及以后可省略模板参数
p(std::array{1,2,3});
// C++11/14需要显式指定模板参数
p(std::array<int, 3>{1,2,3});

2. 用std::vector临时对象传递

临时std::vector的内存同样在函数调用期间有效,可直接传递:

p(std::vector{1,2,3});

3. 修改函数参数为std::span<const int>

如果函数不需要修改传入的元素,将参数改为std::span<const int>后,就可以直接用初始化列表调用:

void p(std::span<const int> s) {
    for(auto x : s) {
        std::cout << x << ' ';
    }
}

// 此时直接调用合法且安全
p({1,2,3});

这是因为std::span<const int>可以从初始化列表构造,对应的临时const数组生命周期会延续到函数调用完成,不会出现悬垂引用问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:05:13