相关疑难解决方法(0)

如何使用std :: array模拟C数组初始化"int arr [] = {e1,e2,e3,...}"的行为?

(注意:这个问题是不必指定元素的数量,仍然允许直接初始化嵌套类型.)
这个问题讨论了C数组的用途int arr[20];.在他的回答中,@ James Kanze展示了C阵列的最后一个据点,它具有独特的初始化特性:

int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Run Code Online (Sandbox Code Playgroud)

我们没有必要指定元素的数量,万岁!现在遍历它与C++ 11的功能std::beginstd::end<iterator>(或您自己的变体),你永远需要甚至认为它的大小.

现在,有没有(可能是TMP)方法实现同样的目标std::array?使用宏可以使它看起来更好.:)

??? std_array = { "here", "be", "elements" };
Run Code Online (Sandbox Code Playgroud)

编辑:中间版本,从各种答案编译,如下所示:

#include <array>
#include <utility>

template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
  return { std::forward<T>(head), std::forward<Tail>(values)... };
}

// in code …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates initialization c++11

133
推荐指数
8
解决办法
1万
查看次数

std :: array的默认初始化?

使用C++ 11 std::array,我是否可以保证语法std::array<T, N> x;将默认初始化数组的所有元素?

编辑:如果没有,是否有一个语法可以在所有数组(包括零大小的数组)上工作,以将所有元素初始化为默认值?

编辑:在cppreference上,默认的构造函数描述说:

(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array 
Run Code Online (Sandbox Code Playgroud)

所以答案可能是肯定的.但我想根据标准或未来标准确定这一点.

initialization default-constructor c++11 stdarray

90
推荐指数
4
解决办法
6万
查看次数

C++ 11:正确的std :: array初始化?

如果我按如下方式初始化std :: array,编译器会给出一个关于缺少大括号的警告

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

这解决了这个问题:

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

这是警告信息:

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]
Run Code Online (Sandbox Code Playgroud)

这只是我的gcc版本中的一个错误,还是故意做的?如果是这样,为什么?

c++ arrays initialization c++11 c++14

60
推荐指数
4
解决办法
6万
查看次数

将std :: array与初始化列表一起使用

除非我弄错了,否则应该可以通过以下方式创建一个std:array:

std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });
Run Code Online (Sandbox Code Playgroud)

然而,使用GCC 4.6.1我无法使其中任何一个工作.编译器简单地说:

expected primary-expression before ',' token
Run Code Online (Sandbox Code Playgroud)

然而初始化列表与std :: vector一起工作正常.那是哪个呢?我错误地认为std :: array应该接受初始化列表,还是让GNU标准C++库团队搞错了?

c++ libstdc++ c++11

54
推荐指数
2
解决办法
3万
查看次数