2017-09-14 1 views
13

내부 배열 구조를 초기화하는 동안 이상한 오류가 있습니다 :C++ 내가 아주 간단한 코드 컴파일하려고

struct T { 
    int a[3]; 
    int b; 
    int c; 
}; 

int main() { 
    const int as[3] = { 5, 6, 7, }; 
    const T t { 
     as, 2, 3, 
    }; 
    return 0; 
} 

을하지만 그것은 나에게 매우 이상한 오류가 있습니다 : 내가 이해에서 같이

t.cpp: In function 'int main()': 
t.cpp:11:5: error: array must be initialized with a brace-enclosed initializer 
    }; 
    ^

을 컴파일러는 모든 것을 한 곳에서 초기화하기를 원합니다. 필드를 개별적으로 초기화 한 다음 나중에 구조를 초기화하는 동안 어떻게 사용합니까?

+4

'std :: array'를 구출합니다. – DeiDei

+3

일반 배열로는 그렇게 할 수 없습니다. 'T'를 수정할 수 있습니까? – juanchopanza

+0

@juanchopanza 가능한 한 '비용'만 내 코드에 넣고 싶습니다. 그리고 객체의 초기화를 위해서 돌연변이를 피하려면이 것이 제 원칙입니다. 그래서 여기에있는 질문은 const 객체를 초기화하는 것입니다. –

답변

21

배열은 복사 생성 가능도 아니고 복사 할당 가능도 아닙니다. C++ 11 이상에 액세스 할 수있는 경우 std::array을 사용할 수 있습니다.

#include <array> 

struct T { 
    std::array<int, 3> a; 
    int b; 
    int c; 
}; 

int main() { 
    const std::array<int,3> as = { 5, 6, 7, }; 
    const T t { 
     as, 2, 3, 
    }; 
    return 0; 
} 

그렇지 않으면 루프를 굴려 요소를 개별적으로 복사해야합니다.

+5

또는 중첩 된 이니셜 라이저 목록을 사용할 수 있습니다. – MikeMB

10

C++ 배열은 복사 가능하지 않으므로 컴파일이 실패합니다. 그것은 명시 적 as 변수를 폐기는하지만 그러나

struct T { 
    int a[3]; 
    int b; 
    int c; 
}; 

int main() { 
    const T t { 
     {5, 6, 7, }, 2, 3, 
    }; 
    return 0; 
} 

대안이다.

참조 : 나는 컴파일러는 나에게 하나 개의 장소에서 모든 것을 초기화하고 싶어 이해하는 것과 같이 http://en.cppreference.com/w/cpp/concept/CopyConstructible

1

.

배열 형식의 포인터 타입에 부패와 다음 컴파일러가 배열 형식에 대한 포인터를 할당하려고하기 때문이다.

필드를 개별적으로 초기화 한 다음 나중에 구조를 초기화하는 동안 어떻게 사용합니까?

구조체에 포인터 유형을 사용할 수 있습니다 (권장하지 않음). 또는 대신 컨테이너 클래스 (STL)를 사용할 수 있습니다.

관련 문제