C++11:私有(private)成员安全

标签 c++ c++11 private auto

<分区>

让我们考虑下一段代码:

#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 是私有(private)的。好的。 所以,我更改代码:

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 是私有(private)的(因此它的构造函数、复制构造函数等等)?

最佳答案

一般来说,访问控制名称或符号,不是 底层实体。有,而且一直有,无数 访问私有(private)成员的方式;你不能做的是使用 此类成员的姓名。

在你的例子中,你没有使用名字,所以没有 问题。

关于C++11:私有(private)成员安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15525234/

相关文章:

c++ - 测量 std::function 的性能成本

c++ - 我应该在 C++ 中使用 qsort 而不是排序吗?

c++ - 类私有(private)成员 - 数组访问失败

c++ - 如何在使用 TCP 的序列化/反序列化中避免跨语言依赖?

c++ - 类的常规实例可以调用常量函数吗?

c++ - 将模板专门化为嵌套类类型

c++ - 使用私有(private)成员初始化静态常量,非整数类成员

c++ - 如何防止其他人在堆栈上创建您的类的新实例?

c++ - C++中的递归组合

c++ - 在什么情况下,编译器在比较两种类型时会创建新的临时局部值?