-8
取本示例代碼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;
}
的Address
類的拷貝構造說,如果n
到恆定Address
對象的引用。因此,我希望修改n
引用的對象是不允許的。似乎編譯器允許直接操作n
的字段。不過,我注意到如果我在Address複製構造函數中添加一個非const
方法並在n
上調用它(例如n.myNonConstMethod()
),編譯器會發出抱怨。
我很驚訝,這段代碼編譯(我試過g ++和clang ++,它們編譯出來的錯誤或警告)。我誤解了使用const
(這不會是第一次!)還是這些編譯器錯誤?
你是認真的嗎?你認爲'可變的無符號密鑰;'是什麼意思? –
構造函數**是** const正確的,編譯器確保你只是告訴編譯器'key'是'mutable',所以它可以在一個常量對象上進行更改。 –
不那麼積極的評論...使用'mutable'你明確地指定了即使對象是const也可以修改關鍵字段。 – log0