我做了一个简单的类(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)名称,因此是合法的