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 回答