2014-09-17 11 views
7

Non sono sicuro di come funziona il seguente codice. Pensavo che dovessi fare {'h', 'e' ...etc...} ma sembra funzionare bene. D'altra parte se si fa std::array<const char* si aggiunge solo un elemento alla matrice. Esistono regole speciali per l'inizializzazione letterale delle stringhe?Come funziona l'inizializzatore std :: array per char?

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

risposta

4

Classe std::array è un aggregato. In questa dichiarazione:

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

viene utilizzata l'inizializzazione dell'elenco. Poiché il primo ed unico elemento di questa istanziazione della classe std::array è un array di caratteri, può essere inizializzato con stringhe letterali.

Sarebbe più corretto utilizzare sizeof operatore anziché funzione strlen:

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

Inoltre si può scrivere

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

perché la matrice di caratteri a sua volta è un aggregato.

Secondo i C++ standard

8.5.2 array di caratteri [dcl.init.string]

1 Matrice di tipo stretto carattere (3.9.1), matrice char16_t, char32_t matrice o l'array wchar_t può essere inizializzato da una stringa letterale stretta, letterale stringa char16_t , stringa letterale char32_t, stringa ampia letterale, rispettivamente, o da una stringa letterale di tipo appropriato racchiusa tra parentesi graffe (2.14.5). I caratteri successivi del valore del valore letterale stringa inizializzano gli elementi dell'array.

[Esempio: char msg [] = "Errore di sintassi sulla riga% s \ n";

0

Ecco un modo per raggiungere questo

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

es. inizializzazione std :: array con una stringa letterale (sì, ha usato una 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"); 

Ecco alcuni codice di prova:

#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; 
} 
Problemi correlati