使用C ++ 0x decltype来访问访问说明符

时间:2011-01-16 09:11:52

标签: c++ c++11 decltype access-specifier

请考虑以下代码:

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中无法实现的方式来绕过访问说明符。

这是故意的吗?这是好习惯吗?

1 个答案:

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