2012-04-25 2 views
0
struct A { 
    int &r; 
    A (int &i) : r(i) {} 
    void foo() const { 
    r = 5; // <--- ok 
    } 
}; 

컴파일러는 r = 5;에 오류를 생성하지 않습니다.
&r은 이미 입니다. const-correct은 참조 (논리적으로는 int* const)입니까? [여기에 related 질문이 하나 있습니다.]클래스 멤버 참조 변수에는 내장 된 "const-correctness"가 있습니까?

+0

const 정확성이 '* this'가 아닌 멤버에 적용된 이후로 나는 참조 된 객체 만 수정했으나 참조 자체는 수정하지 않았습니다. 당신이 포인터 케이스와 비슷하게 지적했듯이. – RedX

+0

@ Justin : 네. 그 생성자는 A (int & i) 여야합니다. –

+0

... 내장 된 const-incorrectness와 비슷하지만 묻는 사람에 따라 달라집니다. –

답변

4

난 당신이 "이미 const를-올바른"뜻을 정확히 모르겠지만, : r에 할당

A의 생성자에 전달 된 어떤 것에 할당과 동일합니다. 이렇게하면 A의 인스턴스에서 아무 것도 수정하지 않으므로 foo이 const로 선언된다는 사실이 장애물이 아닙니다.

struct A { 
    int * r; 
    A (int * i) : r(i) {} 
    void foo() const { *r = 5; } 
} 

foo이 CONST는 사실은 그것에서라고 년대 A 인스턴스 아무것도 수정하지 않음을 의미 :이 완료 줄 것처럼 아주 많이 있습니다. 그것과 함께 제공되는 다른 데이터를 수정하는 데는 충돌이 없습니다.

이 어떤 회원에 대한 참조 인 경우 foo을 호출하면 결국 A의 인스턴스가 수정됩니다. 컴파일러는 구성원 함수의 성격이 위반되었을 수있는 모든 가능한 방법을 포착 할 수 없습니다. 멤버 함수를 선언 할 때 const 당신은 그러한 교묘 한 부분에 관여하지 않는다고 약속합니다.

1

예, 논리적으로는 int* const입니다.

r 참조에 대한 원하지 않는 변경을 방지하려면이 경우 적합한 정규 접근자를 만들고 사용해야 할 수 있습니다.

1

const 멤버 함수는 암시 적으로 그러한 한정자가없는 모든 데이터 멤버의 왼쪽에 const을 삽입하여 해석합니다. 그 const 이미 암시 적으로 참조 (int & const r; 잘못된 구문입니다). 다시 말하면, 참조는 "const-correct"입니다.으로 명명법을 사용할 수 있습니다.

멤버 함수의 const 규정자가 모든 데이터 부재 가능한 모든 유효한 위치에 (예를 들어, 데이터 부재 const 멤버 함수 int const * const * const foo;int ** foo; 작용)하지만 ISN을 const 삽입 영향이 있다면 좋을 것이다 무슨 일이 일어나고, 표준이 말하는 것이 아닙니다.

관련 문제