标签: stdarray

为什么不将std :: array的operator ==()标记为constexpr?

想要在编译时进行比较是很自然的std::array ; 它operator==()显然是constexpr'能够的.然而 - 它没有标记constexpr.这是故意还是疏忽?而且 - 它是什么原因留下来的(显然也是在C++ 17中)?

comparison constexpr c++11 stdarray

6
推荐指数
1
解决办法
315
查看次数

示例,其中std :: array :: max_size和std :: array :: size给出不同的结果

每当我尝试max_size()和使用size()std::array,我得到相同的结果,我想知道是否可能存在两种情况给出不同结果的情况.

c++ arrays stl stdarray

6
推荐指数
2
解决办法
608
查看次数

如何将std :: array <char,N>转换为char(&dest)[N]?

传递std::array<char, N>给这样的函数的方法是什么:

template<size_t N>
void safe_func(char (&dest)[N]);
Run Code Online (Sandbox Code Playgroud)

我试试这个:

#include <array>

template <size_t N> using SafeArray = char[N];

template <size_t N> void safe_func(char (&dest)[N]) {}

int main() {
  SafeArray<10> a1;
  safe_func(a1);
  std::array<char, 10> a2;
  safe_func(*static_cast<SafeArray<10> *>(static_cast<void *>(a2.data())));
}
Run Code Online (Sandbox Code Playgroud)

它有效,但我怀疑,我的演员可能有问题,而在其他编译器或平台上(我使用gcc/linux/amd64),我遇到了错误的引用?

c++ arrays reinterpret-cast c++11 stdarray

6
推荐指数
1
解决办法
615
查看次数

C++:数组 &lt;&gt; 太多初始值设定项

以下代码返回下面的编译错误。我一直无法理解为什么初始化程序太多。该代码使用vector<X>. 有谁知道为什么会报告错误以及如何解决?谢谢

\n\n
#include <iostream>\n#include <array>\nusing namespace std;\n\nstruct X {\n    int x, y;\n};\n\nint main(int argc, char *argv[])\n{\n    array<X,2> a0 = {{0,1}, {2,3}};\n\n    for (auto& p : a0) {\n        cout << p.x << endl;\n        cout << p.y << endl;\n    }\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

汇编:

\n\n
g++ -pedantic -Wall test116.cc && ./a.out\ntest116.cc: In function \xe2\x80\x98int main(int, char**)\xe2\x80\x99:\ntest116.cc:11:34: error: too many initializers for \xe2\x80\x98std::array<X, 2>\xe2\x80\x99\n     array<X,2> a0 = {{0,1}, {2,3}};\n
Run Code Online (Sandbox Code Playgroud)\n

c++ initialization aggregate-initialization stdarray

6
推荐指数
1
解决办法
5200
查看次数

如何构造一个填充了一些统一值的 std::array ?

std::array 可以使用特定值构造(在编译时使用较新的 C++ 版本),例如

std::array a{1, 4, 9};
Run Code Online (Sandbox Code Playgroud)

但是 - 它没有构造函数,或命名为构造函数习语的标准库,采用单个值并复制它。即我们没有:

std::array<int, 3> a{11};
// a == std::array<int, 3>{11, 11, 11};
Run Code Online (Sandbox Code Playgroud)

因此,我们如何构造一个仅给定重复值的数组?

编辑:我正在寻找一种解决方案,它甚至适用于不可默认构造的元素类型;因此,通过默认构造数组然后填充它的解决方案不是我所追求的 - 尽管事实上这适用于int(如示例中所示)的情况。

c++ arrays stdarray

6
推荐指数
1
解决办法
207
查看次数

sfinae 检测容器:std:array 失败

我正在寻找一种使用 SFINAE 来实现某些功能的方法,该功能必须仅适用于某些容器:向量、列表、数组(设置在下面仅作为测试)

基于这个答案,我尝试了下面的代码,该代码使用了一个仅对所需容器返回 true 的特性类。

正如您在此处在线看到的,它失败了std::array

template <typename Container>
struct is_container : std::false_type { };

template <typename... Ts> struct is_container<std::array<Ts... >> : std::true_type { };
template <typename... Ts> struct is_container<std::vector<Ts...>> : std::true_type { };
template <typename... Ts> struct is_container<std::set<Ts...   >> : std::true_type { };
template <typename... Ts> struct is_container<std::list<Ts...  >> : std::true_type { };
template <typename... Ts> struct Dummy{};

int main()
{
    std::cout << "Dummy: " << is_container<Dummy<int>>::value << '\n';
    std::cout << "array: …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae variadic-templates stdarray

6
推荐指数
2
解决办法
72
查看次数

使用 std::array&amp; 分配 C 样式数组的一个子部分而不违反“严格别名”并因此调用 UB?

我可以使用 astd::array<int, N>来为 a 的部分别名int[]而不调用 UB 吗?

https://en.cppreference.com/w/cpp/container/array “此容器是一个聚合类型,其语义与将 C 样式数组 T[N] 作为其唯一非静态数据成员的结构体具有相同的语义。 ”

动机:copy下面的函数不受我的控制,需要通过引用进行单个分配。只有 a struct { int[N]; }like astd::array<int, N>才能进行那种“多对象赋值”?

这是UB吗?

还有别的办法吗?

#include <iostream>
#include <array>

template <std::size_t N>
void print(int (&arr)[N], std::size_t number_rows, std::size_t number_cols) {
    assert(number_rows * number_cols == N);
    for (std::size_t r = 0; r != number_rows; ++r) {
        for (std::size_t c = 0; c != number_cols; ++c) {
            std::cout << arr[r * number_cols + c] …
Run Code Online (Sandbox Code Playgroud)

c++ strict-aliasing undefined-behavior stdarray

6
推荐指数
1
解决办法
293
查看次数

std::array 中的编译时间范围检查

我想在编译时对 std::array 执行范围检查。下面是一个例子:

#include <iostream>
#include <array>

void rarelyUsedFunction(const std::array<double, 2>& input)
{
    std::cout << input[5] << std::endl;
}

int main()
{
    std::array<double, 2> testArray;
    rarelyUsedFunction(testArray);
}
Run Code Online (Sandbox Code Playgroud)

如果我用 g++ 编译它,则没有警告或错误,尽管对不在数组中的元素进行了未定义的访问。编译后的程序只是打印一些随机值。

g++ 中是否有编译器选项可用于在编译时执行的合适的范围/边界检查?我知道我可以添加“-D_GLIBCXX_DEBUG”,但这只会在运行时执行检查。如果我有一个不经常调用的函数,则不会触发。

我知道,不能在所有情况下都执行这样的范围检查,但在上述情况下,编译器应该能够发现问题!?

c++ g++ stdarray

5
推荐指数
1
解决办法
79
查看次数

从固定大小的 std::span 创建固定大小的 std::array 的惯用方法是什么?

std::array<uint8_t,N>我正在尝试从 a创建 a,std::span<uint8_t,N>但我找不到一种没有memcpy、或 的方法来执行此操作std::copy,或者std::ranges::copy这不能保护我免受目标数组大小的错误指定。

#include <algorithm>
#include <array>
#include <iostream>
#include <span>

int main(int argc, char **argv) {
  constexpr size_t N = 10;
  std::array<uint8_t, N> original;
  std::span span(original); // of type std::span<uint8,N>

  std::array copy1(span);                               // does not work
  std::array<uint8_t, N> copy2(span);                   // does not work
  std::array<uint8_t, N> copy3(begin(span), end(span)); // does not work


  // ugly stuff that works, but does not protect me if I specify wrong array size
  constexpr size_t …
Run Code Online (Sandbox Code Playgroud)

c++ stdarray c++20 std-span

5
推荐指数
2
解决办法
305
查看次数

如何在 C++ 中使用原始数组成员概括从 std::array 到 struct 的转换?

在 C++ 中,我有这个来自 C 的结构。这段代码非常旧,无法修改:

struct Point {
   double coord[3];
};
Run Code Online (Sandbox Code Playgroud)

另一方面,我有这个现代函数,它返回现代std::array而不是原始数组:

std::array<double, 3> ComputePoint();
Run Code Online (Sandbox Code Playgroud)

目前,为了Point从返回值初始化 a,我手动从 中提取每个元素std::array

std::array<double, 3> ansArray{ComputePoint()};
Point ans{ansArray[0], ansArray[1], ansArray[2]};
Run Code Online (Sandbox Code Playgroud)

这个解决方案是可行的,因为只有三个坐标。我可以将其模板化为一般长度吗?我想要类似相反的转换:std::to_array

c++ arrays aggregate initialization stdarray

5
推荐指数
1
解决办法
141
查看次数