问题标签 [stdarray]

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 投票
0 回答
409 浏览

templates - 返回 std::array 的 constexpr 函数不被编译器视为 constexpr

因此,在我的 C++11 项目中,我试图根据类模板参数对特定的特征模板专业化进行别名。这是为了让我可以从模板继承,使用 CRTP,并访问特征模板的成员,而无需引用用于专门化它的类型。

改进的最小示例:

主文件

矩阵.h

矩阵实现.h

在编译时,我收到以下错误:

在准备这个最小示例时,我发现我访问 RowPins 的尝试给出了一个未定义的引用,但是在 ColumnPins 中只存储一个 int 意味着我可以毫无错误地访问它。结果,我假设我的 MakePinArray 模板函数有问题,因此编译器忽略了 constexpr 说明符,并允许在运行时调用它,因此出现未定义的引用错误。

但是,我查看了其他答案,例如此答案中的第二个建议:Create N-element constexpr array in C++11 and can't detect a function difference between his build_array function and mine。

任何人都可以a)确认我的理解是正确的(即 constexpr 说明符被丢弃,导致有一个 RowPins 声明但没有定义)和 b)建议我如何纠正这个问题?

如果它有帮助,只是为了获得更多信息,我正在使用 VisualGDB/arm-gcc 4.9.2 并使用-std=c++11.

0 投票
1 回答
31 浏览

c++ - array::data 和 array::front 的用法

& array::front和有什么区别array::data吗?

例 1:

例 2:

以上两个是一样的吗?或者有什么特殊用法array::data吗?

0 投票
4 回答
1773 浏览

c++ - Whats the point of .begin() and .end()?

In C++ library arrays, what are some cases where it's useful to have the .begin() and .end() member functions?

On cplusplus.com, the example use is to iterate through an array:

But

can be used for that.

0 投票
1 回答
2824 浏览

c++ - 如何在没有默认构造函数的情况下使用 std::transform 创建 std::array

我有一个std::array<Foo, 10>,我想创建一个std::array<Bar, 10>使用从Footo的函数Bar。通常我会这样使用std::transform

但是,Bar没有默认构造函数,所以我无法创建bars数组。我可以一直使用vector,但如果能够array保证我总是有 10 个元素,那就太好了。那可能吗?

0 投票
1 回答
160 浏览

arrays - 如何初始化像 std::array 这样的类

我正在尝试为向量算术编写一个容器类。对象的大小是静态的:

这就是我走多远。

但是,我测试了 std::array 类进行比较,我注意到如果初始化列表太长或太短,它会以某种方式做出静态断言。

在我的课堂上,我必须在运行时检查初始化列表的长度。

我假设 std::array 类以某种方式管理它以使用初始化列表表示法直接初始化数据,而没有 std::initializer_list 类。

是否可以像 std::array 一样初始化我的类?

0 投票
2 回答
172 浏览

c++ - 二维 std::array 问题

我以为我喜欢 C++11 中的 std::array 的想法,但看起来它有一些夸克。我发现了这一点,因为以下代码给出了分段错误:

这输出:

sum.size()按预期返回 4,按预期sum[0].size()返回5;IE 好像我们有一个 4 行 5 列的数组。但是,当我尝试执行此程序时出现分段错误(如上所示)。该链接表明,颠倒我访问数组的顺序(如更改sum[i][j]sum[j][i])应该可以工作,但我也遇到了段错误。这让我觉得我的指针可能做错了(我对我的 C++ 有点生疏),所以我将 sum 更改为整数数组,所以它的内容如下:

哪个有效,并输出:

但是,我很困惑,因为如果我将sum[i][j]'s 切换为sum[j][i]'s,它也可以工作并输出相同的东西!sum[5][0]当我第一次运行内部循环的最终迭代期间尝试时,我希望得到一个段错误!我现在愿意称自己很困惑。到底是怎么回事?

额外信息:我正在使用带有 -std=c++11 标志的 g++ 4.8.4。

0 投票
2 回答
1083 浏览

c++ - Call user defined constructor on elements in std::array

I have a simple example where I create an std::array of some number of Foo elements:

When I use the initialiser list in the constructor m_bar(bar) this sets all the Foo.m_bar to 0 (as this is the default constructor parameter value). If I don't do that then it is full with garbage values.

My question is how do I pass in another value different from the default one to the constructor of every element in the array without knowing the array size before hand?

I tried using a init list when creating the array, like so: std::array<Foo, 5> fooArr{3} but that only sets the first element's m_bar to 3.

0 投票
1 回答
1458 浏览

c++ - emplace 和 unordered_map >

我有一个std::unordered_map<string, std::array<int, 2>>. emplace将值插入地图的语法是什么?

我正在使用clang++ -c -x c++ -std=c++14和叮当 3.6.0

我在http://ideone.com/pp72yR中测试了代码

附录:(4)由 Nathan Oliver 在下面的答案中提出

0 投票
3 回答
728 浏览

arrays - 有没有办法强制 std::array 完全初始化

我正在使用std::array<size_t, N>(N 是一个固定的模板变量)。

它工作正常。问题是这个其他代码是静默允许的:

也就是说,即使有遗漏的元素,array它也会以某种方式被初始化,即使它被很好地定义(例如,剩余的元素初始化为零,我不确定)这可能是错误的来源。

有没有办法强制初始化额外元素?例如,通过生成编译器错误或警告。

我考虑的一种选择是使用initializer_list

问题是这充其量会产生一个运行时错误,并且每次调用都会检查一次。我更喜欢编译器错误/警告。

我对默认初始化并没有那么在意,std::array<>{}而是因为初始化不完整。(也许对此无能为力,因为这是从T[N]静态数组的行为继承而来的。)

我尝试使用clang 3.5and gcc 5

0 投票
1 回答
522 浏览

c++ - 使用 std::array 作为 boost::spirit::x3 的属性

std::array我正在尝试使用 boost::spirit 的最新版本 x3(包含在 boost 1.54 中)将数字列表解析为固定大小的容器。由于std::array具有必要的功能,因此被检测为Container,但缺少插入功能,使其不兼容。这是我要完成的一个简短示例:

这不会编译,因为std::array没有insert功能。作为一种解决方法,我使用了语义操作:

然后打电话

反而。这有效(使用带有-std = c ++ 14的clang 3.6.0),但我认为这个解决方案非常不雅且难以阅读。

所以我尝试使用BOOST_FUSION_ADAPT_ADT如下方式将 std::array 改编为融合序列:

然后专门x3::traits::is_container针对 Vertex 告诉 x3 不要将 std::array 视为容器:

但这不会与 x3 结合编译。这是一个错误还是我用错了?在没有所有 x3 代码的情况下调用 egfusion::front(v)可以编译和工作,所以我想我的代码并不是完全错误的。

但是我确信对于这个简单的问题,x3 有一个更清洁的解决方案,不涉及任何融合适配器或语义操作。