拿这个示例代码
#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;
}
该类的复制构造函数Address
表示,n
如果引用一个常量Address
对象。n
因此,我希望禁止对 by 引用的对象进行修改。编译器似乎n
允许直接操作 's 字段。但是我确实注意到如果我const
向 Address 添加一个非方法并n
在复制构造函数中调用它(例如n.myNonConstMethod()
),编译器会抱怨。
我很惊讶这段代码可以编译(我试过 g++ 和 clang++,它们编译时没有错误或警告)。我是否误解了使用const
(这不是第一次!)或者这些编译器错误?