问题标签 [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.
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
.
c++ - array::data 和 array::front 的用法
& array::front
和有什么区别array::data
吗?
例 1:
例 2:
以上两个是一样的吗?或者有什么特殊用法array::data
吗?
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.
c++ - 如何在没有默认构造函数的情况下使用 std::transform 创建 std::array
我有一个std::array<Foo, 10>
,我想创建一个std::array<Bar, 10>
使用从Foo
to的函数Bar
。通常我会这样使用std::transform
:
但是,Bar
没有默认构造函数,所以我无法创建bars
数组。我可以一直使用vector
,但如果能够array
保证我总是有 10 个元素,那就太好了。那可能吗?
arrays - 如何初始化像 std::array 这样的类
我正在尝试为向量算术编写一个容器类。对象的大小是静态的:
这就是我走多远。
但是,我测试了 std::array 类进行比较,我注意到如果初始化列表太长或太短,它会以某种方式做出静态断言。
在我的课堂上,我必须在运行时检查初始化列表的长度。
我假设 std::array 类以某种方式管理它以使用初始化列表表示法直接初始化数据,而没有 std::initializer_list 类。
是否可以像 std::array 一样初始化我的类?
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。
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
.
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 在下面的答案中提出
arrays - 有没有办法强制 std::array 完全初始化
我正在使用std::array<size_t, N>
(N 是一个固定的模板变量)。
它工作正常。问题是这个其他代码是静默允许的:
也就是说,即使有遗漏的元素,array
它也会以某种方式被初始化,即使它被很好地定义(例如,剩余的元素初始化为零,我不确定)这可能是错误的来源。
有没有办法强制初始化额外元素?例如,通过生成编译器错误或警告。
我考虑的一种选择是使用initializer_list
问题是这充其量会产生一个运行时错误,并且每次调用都会检查一次。我更喜欢编译器错误/警告。
我对默认初始化并没有那么在意,std::array<>{}
而是因为初始化不完整。(也许对此无能为力,因为这是从T[N]
静态数组的行为继承而来的。)
我尝试使用clang 3.5
and gcc 5
。
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 有一个更清洁的解决方案,不涉及任何融合适配器或语义操作。