问题标签 [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.

0 投票
1 回答
696 浏览

c++ - 为什么 span 的数组和 std::array 构造函数与其容器构造函数不同

我一直在玩弄std::span在 Godbolt 上使用 clang trunk 和 libc++ 的最新规范,发现一些构造函数令人困惑。

特别是,我发现来自普通旧数组的构造函数和 astd::array与其他容器不同。

例如,以下代码似乎可以编译:

但是,这不会:

这似乎与cppreference.com 上描述构造函数的方式一致,我只是在努力理解为什么会这样。任何人都可以解释一下吗?

0 投票
1 回答
220 浏览

c++ - 返回条件`range_expression`

根据某些条件迭代几个已知范围之一的最有效方法是什么?

二进制条件的伪代码:

这个“示例”显示了我使用基于范围的 for 循环的意图,但由于std::initializer_list引用语义它不起作用。

产量:warning: returning address of local temporary object [-Wreturn-stack-address]

在运行时我可以返回 astd::vector但这将涉及每次调用都构造一个新向量:

我可以使用固定大小std::arraystd::optional<int>但我必须求助于 C++14 或 C++11 解决方案。

0 投票
1 回答
225 浏览

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?

0 投票
1 回答
1138 浏览

c++ - 如何将唯一指针的 std::vector 转换为原始指针的 std::span?

我在某些模块的界面中有以下功能:

,我对 C++20模板Span的简化实现在哪里。std::span

这个函数只是遍历指向对象的连续指针序列并调用它们的一些函数,而不试图修改指针(因此const在签名中)。

在呼叫者方面,我有一个std::vector<std::unique_ptr<MyObject>>. 而且我想将该向量传递给DoSomething函数而不分配额外的内存(对于像临时的任何东西std::vector<MyObject*>)。我只想在恒定时间内将unique_ptrs的左值向量转换Span为不可变的原始指针。

这一定是可能的,因为std::unique_ptr<T>带有无状态删除器的 a 具有与原始指针相同的大小和对齐方式T*,并且它存储在里面的只是原始指针本身。因此,按字节计算,std::vector<std::unique_ptr<MyObject>>必须具有与 -- 相同的表示形式std::vector<MyObject*>,因此必须可以将其传递给期望 a 的函数Span<MyObject *const>

我的问题是:

  1. std::span在不引起未定义行为和依赖肮脏黑客的当前提议下,这样的演员阵容是否可行?

  2. 如果不是,在以下标准(例如,C++23)中是否可以预期?

  3. 使用我在我的版本中实现的强制Span转换,使用肮脏的技巧有什么危险memcpy?它在实践中似乎工作正常,但我想其中可能存在一些未定义的行为。如果有,在哪些情况下,这种未定义的行为会在 MSVC、GCC 或 Clang/LLVM 上让我措手不及,具体情况如何?如果可能的话,我将不胜感激这些场景的一些真实例子。

我的代码是这样的:

0 投票
1 回答
915 浏览

c++ - 为什么 std::span 缺少比较运算符?

不是设计为对//普通数组std::span子区域的轻量级引用吗?它不应该在其 API 中包含比较运算符,以与它们保持一致吗?排除的原因是什么?std::vectorstd::array

注意:通过比较运算符,我的意思是完整的集合 ( <, <=, ...) 或宇宙飞船<=>

0 投票
1 回答
411 浏览

c++ - 如何使用 span 来包装命令行参数

对即将到来的 C++20 的这种使用是否std::span正确并且没有开销来包装命令行参数?

如果它是正确的,我可以进一步使用 withstd::string_view吗?

0 投票
1 回答
106 浏览

c++ - 构建跨度> 从一个数组>

我有一个std::array<std::shared_ptr<void>, N>,并且我有方法可以将这个缓冲区的一部分作为不同的类型来访问,我想使用std::span<std::shared_ptr<T>>这些方法。

有没有办法在不调用 UB 的情况下构建这样的跨度?

0 投票
1 回答
302 浏览

c++ - 为什么 std::span 缺少 cbegin 和 cend 方法?

为什么std::span只有beginend方法而不是它们的常量迭代器对应物cbegincend?(标准

我还注意到,我能找到的跨度提案确实有一个定义cbeginand cend: P0122R7。为什么被移除?

0 投票
2 回答
465 浏览

c++ - 您如何使用标准跨度进行边界检查?

std::vector几乎所有其他容器都有一种非常方便的边界检查方法:at(). std::span显然没有。

0 投票
2 回答
770 浏览

c++ - 将 std::span 分配给 std::vector 的最简单方法

我想这样做

但它不编译。有哪些替代方案?