问题标签 [std-span]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么 span 的数组和 std::array 构造函数与其容器构造函数不同
我一直在玩弄std::span
在 Godbolt 上使用 clang trunk 和 libc++ 的最新规范,发现一些构造函数令人困惑。
特别是,我发现来自普通旧数组的构造函数和 astd::array
与其他容器不同。
例如,以下代码似乎可以编译:
但是,这不会:
这似乎与cppreference.com 上描述构造函数的方式一致,我只是在努力理解为什么会这样。任何人都可以解释一下吗?
c++ - 返回条件`range_expression`
根据某些条件迭代几个已知范围之一的最有效方法是什么?
二进制条件的伪代码:
这个“示例”显示了我使用基于范围的 for 循环的意图,但由于std::initializer_list
引用语义它不起作用。
产量:warning: returning address of local temporary object [-Wreturn-stack-address]
在运行时我可以返回 astd::vector
但这将涉及每次调用都构造一个新向量:
我可以使用固定大小std::array
,std::optional<int>
但我必须求助于 C++14 或 C++11 解决方案。
c++ - Why doesn't libstdc++ have span::span(Container&)?
According to cppreference, in C++20, std::span
is supposed to be constructible using container references:
but in the master branch of libstdc++'s span file (as of Jan 18th 2020), I don't see these constructors. I do see a constructor taking a Range&&
- is that a sufficient replacement? Or - am I missing something?
c++ - 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
我在某些模块的界面中有以下功能:
,我对 C++20模板Span
的简化实现在哪里。std::span
这个函数只是遍历指向对象的连续指针序列并调用它们的一些函数,而不试图修改指针(因此const
在签名中)。
在呼叫者方面,我有一个std::vector<std::unique_ptr<MyObject>>
. 而且我想将该向量传递给DoSomething
函数而不分配额外的内存(对于像临时的任何东西std::vector<MyObject*>
)。我只想在恒定时间内将unique_ptr
s的左值向量转换Span
为不可变的原始指针。
这一定是可能的,因为std::unique_ptr<T>
带有无状态删除器的 a 具有与原始指针相同的大小和对齐方式T*
,并且它存储在里面的只是原始指针本身。因此,按字节计算,std::vector<std::unique_ptr<MyObject>>
必须具有与 -- 相同的表示形式std::vector<MyObject*>
,因此必须可以将其传递给期望 a 的函数Span<MyObject *const>
。
我的问题是:
std::span
在不引起未定义行为和依赖肮脏黑客的当前提议下,这样的演员阵容是否可行?如果不是,在以下标准(例如,C++23)中是否可以预期?
使用我在我的版本中实现的强制
Span
转换,使用肮脏的技巧有什么危险memcpy
?它在实践中似乎工作正常,但我想其中可能存在一些未定义的行为。如果有,在哪些情况下,这种未定义的行为会在 MSVC、GCC 或 Clang/LLVM 上让我措手不及,具体情况如何?如果可能的话,我将不胜感激这些场景的一些真实例子。
我的代码是这样的:
c++ - 为什么 std::span 缺少比较运算符?
不是设计为对//普通数组等std::span
子区域的轻量级引用吗?它不应该在其 API 中包含比较运算符,以与它们保持一致吗?排除的原因是什么?std::vector
std::array
注意:通过比较运算符,我的意思是完整的集合 ( <
, <=
, ...) 或宇宙飞船<=>
c++ - 如何使用 span 来包装命令行参数
对即将到来的 C++20 的这种使用是否std::span
正确并且没有开销来包装命令行参数?
如果它是正确的,我可以进一步使用 withstd::string_view
吗?
c++ - 构建跨度> 从一个数组>
我有一个std::array<std::shared_ptr<void>, N>
,并且我有方法可以将这个缓冲区的一部分作为不同的类型来访问,我想使用std::span<std::shared_ptr<T>>
这些方法。
有没有办法在不调用 UB 的情况下构建这样的跨度?
c++ - 您如何使用标准跨度进行边界检查?
std::vector
几乎所有其他容器都有一种非常方便的边界检查方法:at()
. std::span
显然没有。
- 为什么?
- 有替代品吗?除了推出自己的
at()
?
c++ - 将 std::span 分配给 std::vector 的最简单方法
我想这样做
但它不编译。有哪些替代方案?