如何将右值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
相关产品推荐
相关产品推荐

