忽略C++复制构造函数的构造正确性
Const correctness of C++ copy constructor is ignored?
以代码为例
#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成员函数为该数据成员赋值是合法的。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- C++ 常量正确性/缺少支持常量和非常量实例的类的常量构造函数
- const对象和成员指针的const正确性,构造函数漏洞
- 忽略C++复制构造函数的构造正确性
- 影响正确性的move构造函数/赋值操作符示例