【发布时间】:2013-04-11 23:13:10
【问题描述】:
当我希望类的成员变量在类的生命周期内保持不变时,我有时会使用 const_cast,但它需要在构造函数期间是可变的。示例:
struct qqq {
const vector<foo> my_foo;
qqq(vector<foo>* other) {
vector<foo>& mutable_foo = const_cast<vector<foo>&>(my_foo)
other->swap(mutable_foo);
}
};
我曾假设在构造函数中执行此操作基本上没问题,因为此时没有其他人依赖它,因此它不会与优化等交互不良。
但是最近有人告诉我这是“未定义的行为”,并且在任何情况下构造 const 对象后对其进行变异基本上都是非法的。
有人可以澄清一下吗?这是不好的/未定义的行为/要做的事情吗?
【问题讨论】:
-
您不应该将向量
other作为指针传递给构造函数,除非您明确希望允许用户传递nullptr,并适当地处理这种情况。 -
const vector成员似乎很奇怪。这与让访问器函数返回对成员的const引用有什么不同? -
Konrad:你可以假装 arg 是一个引用。不影响我的问题。
-
Praetorian:在qqq创建后,直到qqq被销毁,向量不应该被修改。 const 强制执行此操作。
-
@Praetorian 通过强制执行不变量来保护自己(以及后来修改代码的其他开发人员)是一件非常明智的事情。
标签: c++ constructor constants