vector<T>
유형의 멤버 변수가 있습니다
(T는 사용자 정의 클래스이지만 int 일 수도 있습니다.)
이 벡터에 대한 포인터를 반환하려는 함수가 있지만 호출자가 벡터를 변경하거나 항목을 변경할 수 있기를 원하지 않습니다. 그래서 반환 유형이
const vector<const T>*
가되기를 원합니다.
여기서 내가하려는 일의 요지를 보여주는 코드가 있습니다;
vector<int> a;
const vector<const int>* b = (const vector<const int>* ) (&a);
이 코드는 나를 위해 컴파일되지 않습니다.
미리 감사합니다!
- 답변 # 1
- 답변 # 2
어떻게해야하는지에 대한 제임스의 대답 외에도
const int
할당 할 수 없으므로 표준 컨테이너에 넣을 수있는 올바른 유형이 아닙니다. - 답변 # 3
왜
vector<T>
vector<const T>
로 올바르게 변환 할 수 없습니다T
경우에도const T
로 변환 할 수 있습니다이것은 constness 또는 상속 여부에 관계없이 프로그래밍에서 반복적으로 발생하는 일반적인 문제입니다 (포함 된 요소 자체가 가능하더라도 파생 개체의 컨테이너를 기본 개체의 컨테이너로 변환 할 수 없음). 문제는 요소별로 요소를 변환 할 수 있지만 컨테이너 자체는 유형 시스템을 손상시키지 않고는 불가능하다는 것입니다.
vector< const T > &vr = my_vector_of_T
를 할 수 있다면 , 그러면vr
를 통해 요소를 추가 할 수 있습니다 이러한 요소는 정의에 따라 일정합니다. 그러나 동시에 같은 요소는my_vector_of_T
에서 별칭이됩니다. 비 const 요소로 사용되며 해당 인터페이스를 통해 수정하여 유형 시스템의 일관성을 깨뜨릴 수 있습니다.vector<int>
의 특별한 경우vector<const int>
로 변환되고 ,vector<const int>
에 요소를 추가하는 것 외에도 실제로 이상한 효과를 느끼지 못할 가능성이 있습니다 constant요소가 시간에 따라 어떻게 변하는 지 확인하지만 두 가지 관련 유형이 주어진 경우 그리고T1
관계가 존재하는 경우, 대부분의 경우T2
의 컨테이너에 동일한 관계를 적용하려고합니다. 그리고T1
타입 시스템을 망칩니다. - 답변 # 4
다음과 같이 강제로 변환 할 수 있습니다 :
T2
하지만 작동하지 않을 것이라고 보장하지 않기 때문에 컴파일하지 않아야한다고 생각합니다.
- 답변 # 5
컴파일러는 이것을 차단하기로 결정합니다. 그러나 이것이 안전하다는 것을 알고 있으므로 어리석은 짓을 할 수도 있습니다.
b = reinterpret_cast<const std::vector<const int>*>(&a);
const vector<const int>* b = (const vector<const int>* )(void *)(&a);
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
const vector<int>
가 있다면 컨테이너를 수정할 수 없으며 컨테이너의 요소를 수정할 수도 없습니다. 당신은const vector<const int>
가 필요하지 않습니다 의미론을 달성하기 위해.