2016-07-01 2 views
1

머리말 :C++ - 브레이스 - 목록 초기화에도 불구하고 알 수없는 크기 할 수 없습니다 '새로운'배열?

나는이 문제에 관해서 아무것도 발견하지 못했다. 내가 찾은 유일한 것은 사람들이 동적으로 int* p = new int[];

내 문제처럼 말했다 배열의 크기에 대한 정보를 제공하지 않고 배열을 할당하는 것은 다릅니다

float arr[]{ 1,2,3 }; 
float* p = new float[]{1, 2, 3}; 

첫 번째 줄은 잘 컴파일의이 두 번째는하지 않습니다

배열의 크기는 새로운 표현으로 지정해야합니다 오류 C3078

필자는 왜 컴파일러가 첫 번째 경우와 같이 목록 초기화에서 배열 크기를 평가하지 않았을까 궁금합니다.

+0

std :: vector p = {1, 2, 3}':) – CoryKramer

+0

제 질문은 동적으로 할당 된 배열의 첫 번째 요소의 메모리 주소를 저장하는 원시 포인터에 대한 것입니다. STL 벡터 클래스를 사용하고 싶다면 이미 그렇게했을 것입니다. – gedamial

+1

우리는 여기에 임의의 제약을 좋아하지 않는다 - 당신은 또한 우리가 어렵게 자신의 삶을 어렵게으로! –

답변

4
void* operator new[] (std::size_t size); 

에는 크기가 명시 적으로 필요합니다. 자신의 연산자를 정의하여 이니셜 라이저 목록을 가져올 수 있습니다.

평론가가 말했듯이 std :: vector는 일반적으로 선호되는 접근 방식이지만 언어의 기술적 인 측면에 관심이있는 것 같습니다.

+0

** 새로운 연산자 **의 구현을 보여줌으로써 완벽하게 제 질문에 대답했습니다;) – gedamial

+0

이것이 좋은 설명인지 잘 모르겠습니다. 배열이 아닌 연산자 new도 크기를 가지며 컴파일러에 의해 자동으로 결정됩니다. 컴파일러가 OP의 경우에 그것을 추론 할 수없는 이유는 무엇입니까? "user-defined-parameters-placement-new"(연산자 new [] (size_t, ...))를 통해 할 수 있다면 Standard에서 간과하는 것처럼 보입니까? – peppe

0

그냥 & hellip; 하지 않습니다. 거기에 대한 구문이 없습니다.

일반적으로 동적 메모리는 동적 길이의 동적 데이터로 채워집니다 (그렇지 않으면 거대한 이유, 동적 할당을 사용하는 이유가 아닌 경우에만 해당). 정적 크기 공제 따라서 요청 된 공간의 거의 대부분은 거의 사용되지 않는 엣지 경우입니다.

3

나는 완벽하게 합리적인 질문을한다고 생각하는데, 이는 단지 new 연산자가 정의 된 방식으로 인해 발생하는 한계이기 때문에이 문제는 그 한계가 있습니다. 다음 무엇

정말 인위적인이지만, 당신이 정말로 동적으로 할당 된 배열의 크기라는 명시 적으로 방지하기를 원한다면 당신을 위해 일할 수있는 그런 다음

template<typename T, T ... args> 
T* createArray() 
{ 
    return new T[sizeof...(args)]{args...}; 
} 

:

int* arr = createArray<int, 1, 2, 3>(); 
+0

나를 대신 템플릿 기능을 보여 주셔서 고마워;) – gedamial

1

내가 읽고 있어요을 Bjarne Stroustrup 책 "프로그래밍 ...."제 17 장, 597 페이지의 Bjarne 명시 적 :

double* p5 = new double[] {0,1,2,3,4} 

및 아래 단락에서 설명합니다. "... 요소 집합이 제공되면 요소 수를 생략 할 수 있습니다."

그래서 내게는이 문제가 컴파일러의 잘못된 구현 때문인 것 같지 않습니까?