10

次のコードがどのように機能するかわかりません。私はあなたがしなければならないと思った{'h', 'e' ...etc...}が、それはうまくいくようだ。一方、std::array<const char*そうすると、配列に要素が1つだけ追加されます。文字列リテラルの初期化に特別なルールはありますか?

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文字配列であるため、文字列リテラルで初期化できます。

sizeoffunction の代わりに operatorを使用する方がより正確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リテラルによって初期化できます。 中括弧 (2.14.5)。文字列リテラルの値の連続する文字は、配列の要素を初期化します。char16_tchar32_t

[ 例:

char msg[] = "Syntax error on line %s\n";
于 2014-09-17T19:43:04.773 に答える
0

これを達成する方法は次のとおりです

// 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 == '\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 に答える