는 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
의 사용을 오해 했습니까 (처음이 아니 었습니다!) 또는이 컴파일러 버그입니까?
심각한가요? 'mutable unsigned key;는 무엇을 의미한다고 생각하십니까? –
생성자 **는 ** const입니다. 컴파일러는 컴파일러에서'key'가'mutable'이라는 것을 컴파일러에게 알려주기 때문에 상수 객체에서 변경할 수 있습니다. –
덜 공격적인 코멘트 ...'mutable'을 사용하면 오브젝트가 const 인 경우에도 키 필드를 수정할 수 있다고 명시 적으로 지정했습니다. – log0