참고 : g ++ 컴파일러를 사용하고 있습니다. (나는 꽤 잘 듣고 표준에 꽤 가깝습니다.)Ints의 배열에 대한 참조를 선언 할 때 왜 const 포인터에 대한 참조가되어야합니까?
의 당신이 int 배열 선언 한 가정 해 봅시다 :
int a[3] = { 4, 5, 6 };
이제
의 당신이 정말 배열 (신경 끄시 고, 왜 다른 비얀보다 참조를 선언하고 싶은 말은하자 언어가 지원 말한다).
다음int*& ra = a;
컴파일러 balks을 다음과 같이 말한다 : -
사례 1은 당신이하려고하면 처음
"invalid initialization of non-const reference of type `int*&' from a temporary of type `int*'"
먼저 일을, 왜 'A'임시 변수 (예하지 않습니다이다) ...
어쨌든, 난 const가 아닌 에러를 볼 때마다, 나는 const를 던지려고 노력한다.
사례 2 - 당신이 시도하는 경우는 :
int*const&rca = a; //wish I knew where the spaces should go (but my other post asking about this sort of protocol got a negative rank while many of the answers got ranked highly -- aha! there are stupid questions!)
그런 다음 모든 것을, 그것은 멋진 컴파일, 당신은 배열에 대한 참조를 가져옵니다.
int* justSomeIntPointer = a; //LINE 1
int*& rpa = justSomeIntPointer; //LINE 2
이 또한 당신에게 원래의 배열에 대한 참조를 제공합니다 : -
사례 3 지금 여기에 컴파일 다른 것입니다.
그래서 여기 내 질문 : 어느 시점에서 정적으로 선언 된 배열 의 이름은 const 포인터가됩니까? int 배열의 이름이 int에 대한 포인터라는 것을 기억하고있는 것 같습니다. 그러나 const 포인터를 int 형으로 기억하지 못했습니다 ...
Case 1처럼 보입니다. 선언 된 참조가 상수 포인터가 아니기 때문에 실패합니다. 이는 'a'가 이미 상수 포인터로 시작되었음을 의미 할 수 있습니다.
선언 된 참조 (rca)가 이미 const-pointer-to-int이기 때문에 Case 2가 작동하는 것처럼 보입니다.
사례 3도 효과가 있지만 깔끔한 이유는 무엇입니까? 상정 포인터 -to-int (즉, 배열 이름 'a')는 언제 const 포인터가됩니까? int * (LINE 1)에 할당하거나 int * & (LINE 2)에 해당 int *를 할당 할 때 발생합니까?
희망이 있습니다. 감사.
그래서 임시 변수는 항상에서 const됩니다
이 배열에 대한 참조입니다? – Jimmy
@Jimmy : 임시 변수가 항상 const는 아니지만 언어가 비 const 참조에 직접 바인딩하는 것을 금지합니다. 배열'a'는 일시적이지 않습니다. 그러나 임시적인 배열 대 포인터 변환으로 인한 포인터입니다. –
스택에 선언되어있는 것은 '자동 저장 기간 보유'를 의미합니다. 즉, 포함 된 블록/오브젝트가 '임시'가 아닌 범위에서 벗어납니다. 플러스 포인트가되도록 동적으로 할당 된 객체를 수동으로 관리해야하는 경우는 거의 없습니다. 마지막으로 필요한 것은 동적 할당이 더 좋은 이유에 대한 잘못된 생각입니다. 이것은 매우 잘 정의되고 다른 의미를 지닌 용어 인 _temporary_의 잘못된 정의를 호출하기 때문에 특히 나쁩니다. –