2014-09-17 4 views
7

다음 코드가 어떻게 작동하는지 잘 모르겠습니다. {'h', 'e' ...etc...}을해야한다고 생각했지만 제대로 작동하는 것 같습니다. 반면에 std::array<const char*을하면 배열에 하나의 요소 만 추가됩니다. 문자열 리터럴 초기화에 특별한 규칙이 있습니까?어떻게 std :: array initializer가 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

클래스 std::array은 집합입니다. 이 진술 내용 :

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

목록 초기화가 사용됩니다. 클래스 std::array의 인스턴스화의 첫 번째 요소는 문자 배열이므로 문자열 리터럴로 초기화 될 수 있습니다. 차례로 문자 배열이 집계하기 때문에

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

은 또한 당신이

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

를 작성할 수

대신 기능 strlensizeof 연산자를 사용하는 것이 더 정확하게 될 것입니다. C++ 표준

8.5.2 문자 배열 [dcl.init.string]

좁은 1 ​​문자 입력 (3.9.1) char16_t 배열 char32_t 배열의 배열에 따르면

또는 wchar_t 배열은 char16_t 문자열 리터럴, char32_t 문자열 리터럴 또는 넓은 문자열 리터럴 또는 적절히 유형화 된 문자열 리터럴 (중괄호 (2.14.5)로 묶음)으로 좁은 문자열 리터럴로 초기화 할 수 있습니다. 문자열 리터럴 값의 연속 문자는 배열의 요소를 초기화합니다.

[예 : 숯 MSG [] = "라인의 S % \ 없음에 구문 오류";

0

다음은이

// GOAL 
std::array<char, sizeof("Hello")> 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; 
} 
: 문자열 리터럴 (예, 그것을 사용하는 매크로)와 초기화 표준 : 배열 여기

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

는 몇 가지 테스트 코드입니다

관련 문제