【发布时间】:2021-09-02 04:28:21
【问题描述】:
假设我有一个包含一些常量成员的类:
class MyClass {
public:
MyClass(int a) : a(a) {
}
MyClass() : MyClass(0) {
}
~MyClass() {
}
const int a;
};
现在我想在某处存储MyClass 的实例,例如作为全局变量或作为另一个对象的属性。
MyClass var;
稍后,我想给var赋值:
var = MyClass(5);
显然这样不行,因为调用了assign操作符,默认不存在,因为MyClass有一个const属性。到目前为止一切顺利。
我的问题是,我怎样才能给var 赋值呢? 毕竟var 本身并没有被声明为常量。
到目前为止我的想法
如果我使用var的指针,我知道问题不存在:
MyClass *var;
var = new MyClass(5);
但是,出于方便的原因,我不想使用指针。
一种可能的解决方案是用placement new 覆盖内存:
template<class T, class... Args>
T &emplaceVar(T &myVar, Args&&... args) {
myVar.~T(); // free internal memory
return *new (&myVar) T(args...);
}
emplaceVar(var, 5);
这将解决问题,但我不确定这是否会导致内存泄漏或由于我缺乏 c++ 经验而没有想到的任何其他问题。此外,我原以为必须有一种更简单的方法。有吗?
【问题讨论】:
-
"毕竟,var 本身并没有被声明为常量。"但是您在任何对象中标明其成员为
const,无论该实例是否为const。 -
用placement-new覆盖
const子对象会导致未定义的行为,基本上 -
你可以为
var写一个重载的赋值运算符——当然这将无法修改a -
@Samufi 因为当某些东西是
const时,编译器假定该值不会改变。我建议阅读std::launder。我自己并不完全理解它,但它的许多例子都是关于将新的东西放入const -
你想做
var = MyClass(5);,它修改了a,因此你希望a是可变的。你可以有一个私人的int actual_a;和一个公共的int const& a;,它指的是actual_a。
标签: c++ constants variable-assignment assignment-operator emplace