27
class C
{
public:
    void foo() const {}
private:
    void foo() {}
};

int main()
{
    C c;
    c.foo();
}

MSVC 2013 はこれを好まない:

> error C2248: 'C::foo' : cannot access private member declared in class 'C'

const参照にキャストすると、次のように機能します。

const_cast<C const &>(c).foo();

非オブジェクトでconstメソッドを呼び出せないのはなぜですか?const

4

2 に答える 2

24

オブジェクトは ではないconstため、非constオーバーロードの方が一致します。オーバーロードの解決は、アクセス チェックの前に行われます。これにより、メンバー関数のアクセスを変更することによって、オーバーロードの解決が誤って変更されることがなくなります。

于 2014-08-14T20:13:01.387 に答える
22

標準から:

13.3.3 最適な実行可能な関数が存在し、一意である場合、オーバーロードの解決は成功し、結果としてそれを生成します。そうしないと、オーバーロードの解決が失敗し、呼び出しの形式が正しくありません。オーバーロードの解決が成功し、実行可能な最適な機能が、それが使用されるコンテキストでアクセスできない場合 (第 11 節)、プログラムは不適切な形式です。

于 2014-08-14T20:15:05.610 に答える