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

发布于 2024-10-12 03:06:32 字数 464 浏览 3 评论 0原文

考虑以下代码:

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 中无法做到的。

这是故意的吗?这是好的做法吗?

Consider the following code:

class A
{
private:
    class B {};
public:
    B f();
};

A a;

A::B g()
{
    return a.f();
}

The compiler rejects this - g cannot return A::B because A::B is private.

But suppose I now use decltype to specify the return value of g:

class A
{
private:
    class B {};
public:
    B f();
};

A a;

decltype(a.f()) g()
{
    return a.f();
}

All of a sudden it compiles fine (with g++ >= 4.4).

So I've basically used decltype to get around an access specifier in a way I would not have been able to in C++98.

Is this intentional? Is this good practice?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谜兔 2024-10-19 03:06:32

访问仅适用于名称(作为特殊情况,适用于构造函数/析构函数)。它不适用于实体本身。规范进一步阐述

[ 注意:因为访问控制适用于名称,如果访问控制适用于 typedef 名称,则仅考虑 typedef 名称本身的可访问性。不考虑 typedef 引用的实体的可访问性。例如,

<前><代码>A类{
B 类 { };
民众:
typedef B BB;
};

无效 f() {
答::BB x; // 好的,typedef 名称 A::BB 是公共的
答::B y; // 访问错误,A::B 是私有的
}

——尾注]

所以你在这里的发现并不令人惊讶。即使在 C++03 中,通过输入 &A::f< 获取 f 的地址时,您也可以获取类型 A::B /code> 并将其传递给函数模板来推导返回类型。

Access only applies to names (and as a special case, to constructors/destructors). It doesn't apply to entities themselves. The spec further elaborates

[ Note: because access control applies to names, if access control is applied to a typedef name, only the accessibility of the typedef name itself is considered. The accessibility of the entity referred to by the typedef is not considered. For example,

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
}

— end note ]

So what you have disovered here isn't surprising. You can get hold of the type A::B even in C++03, when taking the address of f by saying &A::f and passing it to a function template deducing the return type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文