4

次のコードを考えてみましょう。

#include <iostream>
#include "mydemangled.hpp"

using namespace std;

struct A
{
private:
    struct B {
       int get() const { return 5; }
    };

public:
   B get() const { return B(); }
};

int main()
{
    A a;
    A::B b = a.get();

    cout << demangled(b) << endl;
    cout << b.get() << endl;
}

そして、コンパイラ (gcc 4.7.2) は、それA::Bが非公開であると叫びます。わかった。したがって、コードを次のように変更します。

int main()
{
   A a;

   cout << demangled(a.get()) << endl;
   cout << a.get().get() << endl;
}

そして、それは叫びません:

$ ./a.out
A::B
5

つまり、 のインスタンスを作成することはできませんがA::B、使用することはできます。それで、新しい変更(私の質問の鍵)。

int main()
{
   A a;
   auto b = a.get();

   cout << demangled(b) << endl;
   cout << b.get() << endl;
}

そして出力:

$ ./a.out
A::B
5

ここでの問題は、A::Bプライベートであること (したがって、そのコンストラクター、コピー コンストラクターなど) は何ですか?

4

1 に答える 1

5

一般に、アクセスは名前またはシンボルを制御しますが、基になるエンティティは制御しません。プライベート メンバーにアクセスする方法は数多くあります。そのようなメンバーの名前を使用することはできません。

あなたの例では、名前を使用していないので問題ありません。

于 2013-03-20T13:53:25.650 に答える