让我说一堂课
class A{
B* b;
public:
A(B* pb):b(pb){}
}
并且我确保A
的const方法永远不要修改b
指向的对象。这样,当B const*
的实例为const时,可以安全地持有A
。
B const b;
A a(&b); // compile error
A const ca(&b); // compile error too. How can I allow this one
答案 0 :(得分:3)
这是不可能的-如果对象是(即将成为)const
,构造函数甚至不能告诉,更不用说用信息控制重载了
标准的解决方法(通常用于迭代器)是使A
成为模板(即使它只有两个专业化),并使用A<const B>
处理这种情况。是的,这非常糟糕:部分原因是因为它可能会延迟某些诊断,但更多的原因是没有A<B>
的自动转换(const A<const B>&
也无法绑定到A<B>
)。好消息是,即使A
具有可以进行突变 b
(在此公式中通常为const
)的方法,该方法也不需要任何特殊的工作;除非使用,否则它们不会被实例化。