我做了一个简单的类(class),至今仍在我脑海里玩:

class A {
private:
    class B {};

public:
    B getB() {
        return B();
    };
};

从C++ 03开始,此类可以很好地编译,但是就没有一种将getB()的结果分配给左值的好方法,即:
A::B b = A().getB();

不编译。

我通过使用中间模板以这种方式得到它:
template <typename T>
struct HideType {
    typedef T type;
};

HideType<A::B>::type b = A().getB();

但这对于获得A::B左值变量的简单任务来说似乎很糟糕。

从C++ 11开始,这不再是正确的,或者至少在gcc中不再如此。此代码仍然无效:
A::B b = A().getB();

但是此有效:
auto b = A().getB();

标准方面是否存在漏洞?

最佳答案

根据标准的第11条(成员访问控制):



因此,访问控制将应用于名称


auto b = A().getB();

根据标准,您不使用私有(private)名称,因此是合法的

09-10 03:11