2013-07-25 2 views
-8

Address 클래스의 복사 생성자는 말합니다이 예제 코드C++ 복사 생성자의 Const 정확성이 무시됩니까?

#include <iostream> 

using namespace std; 
class Address 
{ 
    public: 
    mutable unsigned key; 

    Address() : key(0) {}; 
    Address(int a) : key(a) {}; 

    // const Address but compiler lets us modify it anyway! 
    Address(const Address &n) : key(++n.key) {}; 
    void showKey() { cout << "key is " << key << endl;} 
    void modifyKey(int k) { key = k;} 
}; 

int main() 
{ 
    cout << "Address a " << endl; 
    Address a; 
    a.showKey(); 

    cout << "Address b " << endl; 
    Address b(a); 
    b.showKey(); 

    if (b.key == a .key) 
    cerr << "Wow the compiler doesn't care about const correctness" << endl; 

    return 0; 
} 

을 가지고 n하는 경우 일정한 Address 객체에 대한 참조입니다. 따라서 n에 의해 참조되는 개체에 대한 수정이 허용되지 않을 것으로 예상됩니다. 컴파일러는 n의 필드를 직접 조작 할 수 있습니다. 그러나 주소가 아닌 const 메서드를 추가하고 복사 생성자 내에서 n (예 : n.myNonConstMethod())이라고 부르는 경우 컴파일러에서 불평합니다.

나는이 코드가 컴파일된다는 것에 놀라움을 금치 못했다. (나는 g ++과 clang ++을 시도해보고 오류나 경고없이 컴파일했다.) 나는 const의 사용을 오해 했습니까 (처음이 아니 었습니다!) 또는이 컴파일러 버그입니까?

+12

심각한가요? 'mutable unsigned key;는 무엇을 의미한다고 생각하십니까? –

+0

생성자 **는 ** const입니다. 컴파일러는 컴파일러에서'key'가'mutable'이라는 것을 컴파일러에게 알려주기 때문에 상수 객체에서 변경할 수 있습니다. –

+2

덜 공격적인 코멘트 ...'mutable'을 사용하면 오브젝트가 const 인 경우에도 키 필드를 수정할 수 있다고 명시 적으로 지정했습니다. – log0

답변

3

Pulled from MSDN :

이 키워드 [mutable]은 클래스의 비 정적 비 CONST 데이터 부재에 적용될 수있다. 데이터 멤버가 변경 가능하다고 선언되면 const 멤버 함수에서이 데이터 멤버에 값을 할당하는 것이 타당합니다.