繁体   English   中英

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

[英]Getting around access specifiers with C++0x decltype

请考虑以下代码:

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

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

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 ,当通过说&A::f并将其传递给函数模板推断返回类型来获取f的地址时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM