-9

拿这个示例代码

#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(这不是第一次!)或者这些编译器错误?

4

1 回答 1

3

从 MSDN 中提取

此关键字 [ mutable] 只能应用于类的非静态和非常量数据成员。如果一个数据成员被声明为可变的,那么从一个 const 成员函数给这个数据成员赋值是合法的。

于 2013-07-25T15:39:49.720 回答