参考类成员的恒定性
constness for reference class members
我有几个类,其中一个类保留对另一个对象的引用:
class Inner {};
class Outer {
Inner & in;
public:
Outer(Inner & in) : in(in) {}
};
如果我必须从常量引用到 Inner 创建外部对象怎么办?我必须为此编写特定的类,比如说 OuterConst?
UPD:使用模板有什么简洁的解决方案吗?为了避免 OuterConst 类中的代码重复。
UPD2:当 Inner 没有 const 时,它应该是可修改的(所以我不能在当前的 Outer 实现中将 const 添加到 Inner 成员中(。
如果我必须从常量引用到 Inner 创建外部对象怎么办?
好吧,你不能。差不多就是这样。如果 Outer 只需要调用 Inner 的 const 成员函数,那么使其成为 const 引用 - 否则,您的类依赖于可变的 Inner 对象,您不应该从 const 引用创建 Outer 对象。
问题是Outer
是否需要通过in
修改Inner
。如果是这样,您应该保留in
作为Inner &
。在这种情况下,如果你有一个const Inner &
那么当然你不能把它传递给Outer
,因为引用不允许你修改引用的Inner
,但Outer
确实需要修改Inner
。
如果Outer
不需要修改Inner
,那么你应该只in
写成const Inner &
,在这种情况下,Outer
可以用Inner &
或const Inner &
初始化。
你当然可以写:
class Inner {};
template <class T>
class Outer {
T& in;
public:
Outer(T& in) : in(in) {}
};
然后初始化类型为 Outer<Inner>
或 Outer<const Inner>
的对象。但是Outer
必须在这两种情况下做一些不同的事情,否则你可以in
const Inner &
.在这种情况下,您可能最好编写单独的类,以便明确Outer
执行不同操作。
您可以存储常量引用,并在需要时使用 const_cast
将常量丢弃。如果添加一些运行时检查,它也是安全的。
class Inner { /* ... */ };
class Outer {
Inner const & in;
bool const inIsConst;
Inner & inMutable()
{
if (inIsConst)
throw std::logic_error("in is const.");
else
return const_cast<Inner &>(in);
}
public:
Outer(Inner const & in) : in(in), inIsConst(true) {}
Outer(Inner & in) : in(in), inIsConst(false) {}
// always safe
void Foo() { std::cout << in.getFoo(); }
// will throw if *this was constructed with a const Inner
void Bar() { inMutable().setFoo(in.getFoo() + 1); }
};
当然,您始终可以将其分为两类:一类不能更改in
,另一类可以。
为此,您可以从不能更改的类派生可以更改in
的类。或者,您可以从具有作为受保护成员的公共函数的公共基类派生两者,并使用派生类中的using Base::Function
公开适当的基类。
这取决于。如果Outer
的两个角色对于不同的常性是不同的(一个必须编辑,另一个不编辑(,那么是的。
但是,如果这两个角色相同(这意味着不会对常量或非常量引用进行任何更改(,则始终将const Inner&
作为参数。如果传递了一个非常量参数,它将自动"提升"为const
参数。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 指针类型类成员的动态强制转换的恒定性是什么?
- 自动模板参数、数据成员和恒常性
- 为什么对引用的常量引用会失去其恒定性?
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 运算符的要求<恒定性在标准::stable_sort
- 模板参数推导由于恒定性不一致而失败
- 为什么模板参数失去恒定性?
- 为什么普遍引用不保持其论点的恒定性
- 是否可以使用 SFINAE 检测类方法的恒定性?
- 在模板中强制转换为引用似乎会抛弃恒定性
- 在分配对象时保持恒定性
- 常量成员函数中模板成员的恒定性
- 变量的恒定性及其生存期
- 尊重恒定性,同时避免在堆上重新分配
- C++ - 为什么常量函数不强制成员指针上的恒常性?
- 参考类成员的恒定性
- 当函数参数常量引用 T 时,为什么 T 的模板参数推导'skips'数组元素的恒定性?
- 从"this"中抛弃恒常性,然后更改成员值是否会调用未定义的行为?