std :: array初始化如何为char的工作?

我不确定下面的代码是如何工作的。 我以为你必须做{'h', 'e' ...etc...}但它似乎工作正常。 另一方面,如果你做std::array<const char*它只会向数组中添加一个元素。 字符串文字初始化有特殊的规则吗?

std::array<char, strlen("hello world!") + 1> s = {"hello world!"};
for (size_t i = 0; i < s.size(); ++i)
{
    std::cout << s[i];
}

std::array是一个聚合。 在这个声明中:

std::array<char, strlen("hello world!") + 1> s = {"hello world!"};

列表初始化被使用。 作为类std::array的这个实例的第一个也是唯一的元素是一个字符数组,它可以用字符串文字初始化。

使用sizeof运算符而不是函数strlen会更加正确:

std::array<char, sizeof( "hello world!" )> s = {"hello world!"};

你也可以写

std::array<char, sizeof( "hello world!" )> s = { { "hello world!" } };

因为字符数组又是一个聚合。

根据C ++标准

8.5.2字符数组[dcl.init.string]

1窄字符类型(3.9.1),char16_t数组,char32_t数组或wchar_t数组可以分别通过窄字符串文字,char16_t字符串文字,char32_t字符串文字或宽字符串文字来初始化,或者通过适当的用括号括起来的字符串文字(2.14.5)。 字符串字面值的连续字符初始化数组的元素。

[示例:char msg [] =“第%s行的语法错误 n”;


这是实现这一点的一种方式

// GOAL
std::array<char, sizeof("Hello")> myarray = {"Hello"};

即。 用字符串文字初始化std :: array (是的,它使用了一个宏)

// SOLUTION
#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal}
std::array STD_CHAR_ARRAY_INIT(myarray, "Hello");

以下是一些测试代码:

#include <iostream>
#include <array>

using std::cout;
using std::ostream;

template<typename T, size_t N>
std::ostream& std::operator<<(std::ostream& os, array<T, N> arr)
{
  {
    size_t cnt = 0;
    char strchar[2] = "x";
    for (const T& c : arr) {
      strchar[0] = c;
      os << "arr[" << cnt << "] = '" << (c == '' ? "" :  strchar /*string(1, c)*/  ) << "'n"
         << '.' << c << '.' << 'n';
      ++cnt;
    }
  }
  return os;
}


#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal}

int main()
{
  std::array STD_CHAR_ARRAY_INIT(myarray, "Hello");
  cout << myarray << 'n';
  return 0;
}
链接地址: http://www.djcxy.com/p/81475.html

上一篇: How does std::array initializer work for char's?

下一篇: Adding references in PHP to an array creates an array of references