请考虑以下代码:
class A
{
private:
class B {};
public:
B f();
};
A a;
A::B g()
{
return a.f();
}
编译器拒绝这个 - g不能返回A :: B,因为A :: B是私有的。
但是假设我现在使用decltype来指定g:
的返回值class A
{
private:
class B {};
public:
B f();
};
A a;
decltype(a.f()) g()
{
return a.f();
}
突然之间编译得很好(g ++> = 4.4)。
所以我基本上使用了decltype以一种我在C ++ 98中无法实现的方式来绕过访问说明符。
这是故意的吗?这是好习惯吗?答案 0 :(得分:5)
Access仅适用于名称(作为特殊情况,适用于构造函数/析构函数)。它不适用于实体本身。该规范进一步阐述了
[注意:因为访问控制适用于名称,如果将访问控制应用于typedef名称,则仅考虑typedef名称本身的可访问性。不考虑typedef引用的实体的可访问性。例如,
class A { class B { }; public: typedef B BB; }; void f() { A::BB x; // OK, typedef name A::BB is public A::B y; // access error, A::B is private }
- 结束说明]
所以你在这里发现的并不奇怪。即使在C ++ 03中,当通过说A::B
并将其传递给函数模板推断返回类型时,可以获取f
的地址,即可获得类型&A::f
。