c++ - 强制外部函数为 const

标签 c++ constants mutable const-correctness const-cast

这是我的问题。我创建了一个成员函数声明为 const 的类,该类使用我无法修改(在其他人的代码中声明)并且未声明为 const 的外部函数。更准确地说

别人的代码

class B {
public:
    void foo();
};

我的代码

class A : public B {
public:
    void bar() const {
        this->foo();
    }
};

我知道对于成员数据,我们可以通过使用 mutableconst_cast 来强制保持常量正确性。我如何“破解”foo,以便我的编译器理解我想将它当作 const 使用,即使它没有在其他人的代码中声明?

最佳答案

  1. 不要那样做。

  2. 不要这样做:

例子:

class A : public B { 
public: 
    void bar() const { 
        const_cast<B*>(static_cast<const B*>(this))->foo();
    } 
}; 

编辑: 有效的用例是如果:

  1. 函数 B::foo() 不修改状态,并且可以声明为 const,但是……
  2. 编写 B::foo() 的人忘记将其声明为 const,并且...
  3. 你不能改变它,因为它会破坏你无法控制的东西。

理论上这不会发生,但实际上有时会发生。

正如其他回答者所说的那样,更好的答案是固定 B::foo(),或者提供一个替代函数来做同样的事情 声明为常量。

关于c++ - 强制外部函数为 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831802/

相关文章:

pointers - 修改原始值时更改借用值

c++ - 使用英特尔 C++ 编译器 2019.4 编译的简单控制台应用程序无法在 Ryzen 处理器上运行

c++ - C++ 中的大小函数和线程安全

c++ - 如何避免到处链接某个目标文件

c++ - 模板参数中的 "T"和 "const T"有区别吗?

class-design - 如何重写在D中使用可变的C++代码?

string - Rust 字符串中的 "growable"和 "mutable"有什么区别?

c++ - 如何将文件放入 boost::interprocess::managed_shared_memory?

c++ - `invalid initialization of non-const reference` 是什么意思?

c++ - 为什么 typename 是必需的,即使它似乎足以推断名称应该是一种类型?