>

vector<T> 유형의 멤버 변수가 있습니다  (T는 사용자 정의 클래스이지만 int 일 수도 있습니다.) 이 벡터에 대한 포인터를 반환하려는 함수가 있지만 호출자가 벡터를 변경하거나 항목을 변경할 수 있기를 원하지 않습니다. 그래서 반환 유형이 const vector<const T>* 가되기를 원합니다.

내가 시도한 캐스팅 방법 중 어느 것도 효과가 없었습니다. 컴파일러는 T가 const T와 호환되지 않는다고 계속 불평합니다.

여기서 내가하려는 일의 요지를 보여주는 코드가 있습니다;

vector<int> a;
const vector<const int>* b = (const vector<const int>* ) (&a);

이 코드는 나를 위해 컴파일되지 않습니다.

미리 감사합니다!

  • 답변 # 1

    const vector<int> 가 있다면  컨테이너를 수정할 수 없으며 컨테이너의 요소를 수정할 수도 없습니다. 당신은 const vector<const int> 가 필요하지 않습니다  의미론을 달성하기 위해.

  • 답변 # 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);

  • 이전 python - numpy의 from 함수에 대한 매개 변수
  • 다음 mongodb - 필드 이름에 도트를 사용하는 방법은 무엇입니까?