忽略C++复制构造函数的构造正确性

Const correctness of C++ copy constructor is ignored?

本文关键字:正确性 构造函数 C++ 复制 忽略      更新时间:2023-10-16

以代码为例

#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.myNonConstMethod())内的n上调用它,编译器会抱怨。

我对这段代码的编译感到惊讶(我尝试过g++和clang++,它们编译时没有错误或警告)。我是否误解了const的使用(这不是第一次!)或者这些编译器是错误的?

从MSDN中提取:

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