c++ - 避免代码重复(常量正确性)redux

标签 c++ constants code-duplication const-correctness

我正在读这个question here这里关于常量正确性。 Scott Meyer 解决方案似乎是一个很好的变通方法,但是如果您有一个使用 this 指针的成员函数(需要 const 和非 const 版本)怎么办。如果成员函数是 const,那么 this 自动意味着 const this,这使得很难有一个单一的 const 大部分代码所在的函数。

我想到的一个可能的解决方法是将对 this 的引用作为参数传递给 const 函数,这样函数就可以使用该引用而不是直接使用 这个指针。但是,这样安全吗?它似乎是安全的(如果非常 hacky),因为您实际上并没有在 const 对象上使用 const_cast。相反,您只是通过将对象的非 const 引用传递给 const 成员函数来绕过它提供的契约。

例如:

class Foo
{
    private:

    template <class SelfReference>    
    void f1(SelfReference& self) const
    { 
        // We now might have a non-const reference to "this", even though
        // we're in a const member function.  But is this safe???
    }

    public:    

    void f2()
    {
        f1(*this);
    }

    void f2() const
    {
        f1(*this);
    }
};

这似乎提供了一种很好的方法来避免在需要函数的 const 和非 const 版本时必须复制大量代码,但这安全吗?或者它是否会以某种方式导致未定义的行为?

最佳答案

请注意,即使您在 const f1() 函数中并且您可以修改“this”,f2() 也被标记为非常量,因此通过调用f2() 对象可能会被修改。单独使用 f1() 不会让您修改其自身(或任何 const 对象)中的“this”。您甚至不能调用 f2() 来帮助 const Foo 对象,所以这不会带来任何好处。

换句话说 - 在您的示例中非常量 f1() 就足够了。您不需要 f1() const 或此处的两个版本。


更新 现在您将无法在 f1() 的“const”版本中修改 self,即 void f1(const Foo & self) constvoid f2() const 调用。

关于c++ - 避免代码重复(常量正确性)redux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3795847/

相关文章:

c++ - 一个 QThread 对象中的槽函数可以并发运行吗?

c++ - "Permanent"标准::setw

c++ - 创建 const std::vector 作为两个 const std::vector 的串联

java - 如何在没有继承的情况下避免 DTO 重复?

c# - 当返回类型不同时,我可以避免代码重复吗?

C++ 代码在 g++ 和 vs2008 中得到不同的结果

c++ - 将非静态 const 数组声明为类成员

java - Java中如何存储和重用一组相关的常量值?

macos - 热重装后,Android Studio随机复制行

c++ - '*' 标记之前的预期主表达式