有没有办法让两个具有不同访问权限的 getter 并在 for 循环中使用其中一个?

Is there a way to have two getters with different accesses and use in for loop one of them?

class Foo {
    // friend Bar;

    public: const std::list<int*>& numbs () const { // (1)
        return mNumbs;
    }

    protected: std::list<int*>& numbs () { // (2)
        return mNumbs;
    }

    private: std::list<int*> mNumbs;
};

int main () {
    Foo foo;
    for (const auto& e : foo.numbs()) { // (3)
        // some work...
    }
}

我的意图是强制使用 (1) 客户端方法和 (2) Foo class 的朋友方法。 但是编译器正在尝试使用 (2) 在 for 语句中受保护的方法并且发生错误 (3):

std::__cxx11::list<int*>& Foo::numbs()’ is protected within this context

我找到了一些解决方案:

  1. 正在更改 (2) 方法的名称(例如更改为 numbs_)。
  2. 将 (2) 方法的访问 class 更改为 public(我对此不满意)。

有谁知道更好的主意吗?

方法 1 不是 更好的匹配,因为 foo 不是常量对象。仅当您的对象是常量时才会调用它。

如果您的调用者选择将对象标记为 const,只有这样错误才会消失。例如,这将按预期工作:

const Foo foo;
for (const auto& e : foo.numbs()) { // (3)
    // some work...
}

看来像这样设计它是个坏主意。

附带说明一下,您还需要知道 C++ 中的可见性和可访问性是不同的东西。两种方法都是可见的,但只有一种是可访问的。并且在类型或派生类型之外无法访问更好匹配的那个。因此错误。

P.S.: 如评论中所述,const_cast<> 也将达到相同的效果。