컨테이너 클래스 (예 : std::vector
)에는 컨테이너의 크기 (즉, 크기)와 요소의 고정 된 개념이라는 두 가지 개념이 있습니다. std::vector
이 두 가지를 혼동 것 같습니다 같은 다음과 같은 간단한 코드는 컴파일되지 않습니다 :에 데이터 멤버 (세 개의 포인터가 데이터와 말 & 말을 시작하더라도const와 컨테이너의 내용이 아닌 const와 그 내용
struct A {
A(size_t n) : X(n) {}
int&x(int i) const { return X[i]; } // error: X[i] is non-const.
private:
std::vector<int> X;
};
주 할당 된 버퍼의 수)가 인 경우 이 아니며 operator[]
을 호출하여 변경 한 경우이 아니라면이 멤버는 const
이 아닌 것입니까?
참고 또한 원시 포인터를 들면 일정한 네스의 두 개념이 깔끔하게 이러한
struct B {
B(size_t n) : X(new int[n]) {}
~B() { delete[] X; }
void resize(size_t n); // non-const
int&x(int i) const { return X[i]; } // fine
private:
int*X;
};
작품 잘 대응하는 원시 코드 포인터 것을 분리한다.
따라서 std::vector
(mutable
을 사용하지 않고)을 사용할 때이를 처리하는 올바른/권장 방법은 무엇입니까?
(여기서는, 그래서 UB X
가 비 const
알려져있다) 허용 가능한 것으로 간주 const_cast<>
int&A::x(int i) const { return const_cast<std::vector<int>&>(X)[i]; }
에서처럼입니까?
편집 그냥 더 혼란을 방지하기 위해 : 나는 요소, 즉 컨테이너의 내용 만 수정하고 싶어하지 컨테이너 자체 (크기 및/또는 메모리 위치).
'std :: vector'의 데이터는'operator []'를 호출하여 변경할 수 있습니다. 'A :: X'를 작성 했으므로'a.x (1) ++; '는 완벽하게 합법적이며 벡터의 내용을 수정합니다. –
@DavidSchwartz 벡터의 * 내용 *은 실제 * 데이터 *가 아닙니다 (논리적으로 연결할 수는 있지만). 'std :: vector'를 검사하면, 데이터로서 3 개의 포인터 만 있습니다 (데이터의 시작과 끝, 버퍼의 끝). 이들은 변함없이 유지됩니다. – Walter