【问题标题】:is it ok to use const_cast in member routines to avoid duplicated code在成员例程中使用 const_cast 可以避免重复代码吗
【发布时间】:2014-03-17 08:58:56
【问题描述】:

在这种情况下可以使用 const_cast 还是有任何警告:

class A{
public:
  A() : m_someData(5)
  {}
  int& get() { return m_someData;};

  const int& get() const {  const_cast<A*>(this)->get(); };
private:
  int m_someData;
};

其目的是 get 例程可能要复杂得多,并且应避免代码重复。

【问题讨论】:

    标签: c++ oop const-cast


    【解决方案1】:

    没有。我不建议这样做。我建议你反方向使用const_cast

    int& get() { return const_cast<int&>(const_cast<A const &>(*this).get()); };
    
    const int& get() const {  return m_someData; };
    

    也就是说,你应该从 non-const 重载中调用 const 成员函数,而不是反过来。这样,您可以确保即使非常量版本也不会改变对象的状态,并且两个函数中的代码确实 same (因为您最终会调用 const 版本) - 而且 肯定会是代码重复,这是您想要避免的。

    如果你反过来这样做,编译器不会告诉你是否在函数的非 const 版本中修改了对象,并且从 const 函数调用这样的函数是不正确的。

    【讨论】:

    • 我认为谁叫另一个并不重要;无论哪种方式,您都必须确定它们都没有进行任何修改。当 const 委托给非常量时,您必须确保非常量不进行任何修改。当非 const 委托给 const 时,您必须确保 const 实际上 const 不会返回任何内容。并且使用 const 重载调用非 const 重载,您至少可以保存一个 const_cast
    • @Angew:非常量版本可能会修改对象。如果你这样做,编译器不会告诉你。所以从 const 函数调用非 const 函数是不安全的。
    • @Angew 我认为他是对的。如果我将 this 转换为 nonconst 并调用 non const get() 那么编译器不会强制 this 对象在 get 中没有改变
    • 如果您在const 重载中进行工作,编译器有望停止大多数修改,因为*thisconst。如果您在非const 重载中进行工作,您可能会意外调用未定义的行为。
    • 我认为决策真正关心的是程序员而不是编译器。如果非常量版本如this answer中所建议的那样,它只是一行,我可以很容易地检查对象没有被修改。如果非常量版本是真正完成这项工作的版本并且有 10 行长,那么很容易错过修改状态的点。所以我宁愿让编译器为我做检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多