mato
mato

Reputation: 533

How can I create an std::array of char array?

I was trying to create a std::array of char array so that I could declare it static constexpr.

eg:

#include <array>

int main(){

  static constexpr char A[] = "abc";
  static constexpr char B[] = "def";
  static constexpr std::array<char[], 3> tmp{A, B};
}

When I do this I get error message " too many initializers for"

Upvotes: 2

Views: 11545

Answers (3)

pjb
pjb

Reputation: 91

With C++20 std::to_array can be used.

static constexpr char A[] = "abc";
static constexpr char B[] = "def";
static constexpr auto tmp = std::to_array({A, B});

Upvotes: 1

Swift - Friday Pie
Swift - Friday Pie

Reputation: 14589

By output of your compiler I could surmise that you have a non-standard extension active. Stricly ISO-wise use of char[] as parameter of template is not legal,. Some compilers would treat that as char[0].

what your array meant to store? way you're trying to do it would store adresses of array to char (and only way to do so would be replace char[] by by const char* in template parameters. std::array is trivial class which stores data statically so you cannot implement array with variable length of strings that way.

Either 1) abolish constexpr and use std::string 2) use const char* 3) worst case (which sometimes is the best) - use fixed array length or "naked" 2-dimensional array with aggregate initializer list.

Upvotes: 1

Daniel Langr
Daniel Langr

Reputation: 23497

You may use:

static constexpr std::array<char[4], 2> tmp {{{ A[0], A[1], A[2], A[3] },
                                              { B[0], B[1], B[2], B[3] }}};

or

static constexpr std::array<char[4], 2> tmp { "abc", "def" };

From http://en.cppreference.com/w/cpp/container/array:

When initializing an object of array type, the initializer must be either a string literal (optionally enclosed in braces) or be a brace-enclosed list of initialized for array members.

Thus you cannot initialize an array (member of std::array of char[4]) by an object of another array.

Upvotes: 0

Related Questions