如何在std::expected中返回range::view?类型定义咨询
在std::expected中返回range::view的可行性及类型说明
完全可以在std::expected中返回range视图,但要注意视图的核心特性:视图是轻量级的非拥有式包装,不会复制底层数据,因此必须保证返回的视图所引用的data,在调用方使用该视图时始终处于有效状态,否则会产生悬垂引用问题。
关于rangeType的填写,由于range视图的类型通常是匿名的实现类,推荐两种实用方式:
1. 用decltype显式推导类型
通过decltype推导视图的具体类型,提前定义为别名:
// 假设data是已定义的变量(比如std::vector<int>&) using RangeType = decltype(data | ranges::views::take(0)); std::expected<RangeType, error> get_range() { if (some_condition(x)) return std::unexpected(errorcode); return data | ranges::views::take(x); }
这里take(0)仅用于推导类型,实际返回的take(x)与它的类型完全一致。
2. 尾置返回类型自动推导
利用尾置返回类型让编译器直接推导std::expected的模板参数:
auto get_range() -> std::expected<decltype(data | ranges::views::take(x)), error> { if (some_condition(x)) return std::unexpected(errorcode); return data | ranges::views::take(x); }
关键注意事项
- 若
data是函数内部的局部变量,返回基于它的视图会导致悬垂引用——局部变量在函数返回后会被销毁,视图将引用无效内存。 - 如果需要让返回的range拥有独立生命周期,可以考虑返回
std::expected<std::vector<YourType>, error>,但这会复制底层数据,适合不需要视图轻量特性的场景。
内容的提问来源于stack exchange,提问作者yannick
相关产品推荐
相关产品推荐

