gpt4 book ai didi

c++ - 良好做法 : Constant to non-constant cast

转载 作者:太空狗 更新时间:2023-10-29 23:40:00 25 4
gpt4 key购买 nike

当函数不修改对象参数时,我总是让它请求一个常量引用,即使引用的对象不是真正的常量。这是错误的吗?

对于包装类,我想这样写:

template<class B>
class Wrapper{
private:
B* base_;
public:
Wrapper(const B& b) { base_ = const_cast<B*>(&b); }
void ModifyBase();
};

构造函数不修改基类,因此它要求常量引用。

包装器有一些方法需要修改基类,因此它需要存储一个非常量指针(因此需要进行转换)。

我觉得我的解决方案不是最好的。

有更好的方法吗?

是否有公认的约定?

最佳答案

当您选择参数作为 const 引用时,您是在告诉用户“您可以相信,如果您向我传递一个对象,它不会[通过此引用]被修改† ”你应该尽可能经常这样做,因为用户可以通过查看类型来更多地了解你的函数将做什么和不做什么。此外,传递可变引用可能会导致代码难以推理。

但是,在您的问题中,您的 const 并没有说实话。它抛弃了 const 特性并存储了一个非 const 指针——这意味着该对象很可能会被修改。你欺骗了用户!构造函数本身对对象没有任何作用并不重要。它允许它被其他成员函数修改。这是不好的行为。您的构造函数不应采用 const 引用。

不仅如此,您当前的实现还允许未定义的行为。即使将最初声明为 const 的对象提供给您的 Wrapper,它也不在乎。它抛弃了它的 const 特性,并允许其他成员函数修改它。修改最初为 const 的对象是未定义的行为。

† 查看 6502 的评论

关于c++ - 良好做法 : Constant to non-constant cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com