10

我不确定以下代码是如何工作的。我以为你必须这样做,{'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];
}
4

2 回答 2

8

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

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

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

sizeof使用operator 而不是 function会更正确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[] = "Syntax error on line %s\n";
于 2014-09-17T19:43:04.773 回答
0

Here's a way of achieving this

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

ie. initializing std::array with a string literal (yes, it used a macro)

// 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");

Here's some test code:

#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 == '\0' ? "\\0" :  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;
}
于 2014-12-14T14:12:43.960 回答