2014-09-17 6 views
7

Ich bin mir nicht sicher, wie der folgende Code funktioniert. Ich dachte, du müsstest {'h', 'e' ...etc...} tun, aber es scheint gut zu funktionieren. Auf der anderen Seite, wenn Sie std::array<const char* tun, fügt es nur ein Element zum Array hinzu. Gibt es spezielle Regeln für die String-Literal-Initialisierung?Wie funktioniert der Initiator std :: array für Chars?

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

Antwort

4

Die Klasse ist ein Aggregat. In dieser Aussage:

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

Liste Initialisierung wird verwendet. Da das erste und einzige Element dieser Instanziierung der Klasse ein Zeichenarray ist, kann es mit Zeichenfolgenliteralen initialisiert werden.

Es wäre richtig sein sizeof Operator zu verwenden, anstatt Funktion strlen:

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

Auch Sie könnten

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

schreiben, weil das Array Charakter wiederum ein Aggregat ist.

Nach dem C++ Standard

8.5.2 Zeichen-Arrays [dcl.init.string]

1 Eine Anordnung von engen Zeichenart (3.9.1), char16_t Array char32_t Array oder das Array wchar_t kann durch ein schmales Zeichenfolgenliteral, char16_t Zeichenfolgenliteral, char32_t Zeichenfolgenliteral oder Widezeichenfolge Literal bzw. durch ein entsprechend typisiertes Zeichenfolgenliteral in Klammern (2.14.5) initialisiert werden. Aufeinanderfolgende Zeichen des Werts des Zeichenfolgenliterals initialisieren die Elemente des Arrays.

[Beispiel: char msg [] = "Syntaxfehler in Zeile% s \ n";

0

Hier ist ein Weg zur Erreichung dieses

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

dh. Initialisierung std :: Array mit einem Stringliteral (ja, es verwendet ein Makro)

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

Hier einige Testcode:

#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; 
} 
Verwandte Themen