委托给私有部分

2024-03-18

有时,C++ 的隐私概念让我感到困惑:-)

class Foo
{
    struct Bar;
    Bar* p;

public:

    Bar* operator->() const
    {
        return p;
    }
};

struct Foo::Bar
{
    void baz()
    {
        std::cout << "inside baz\n";
    }
};

int main()
{
    Foo::Bar b;   // error: 'struct Foo::Bar' is private within this context

    Foo f;
    f->baz();     // fine
}

Since Foo::Bar is private,我无法声明b in main。但我可以从调用方法Foo::Bar正好。为什么这会被允许?这是意外还是有意为之?


哦等等,情况变得更好了:

Foo f;
auto x = f.operator->();   // :-)
x->baz();

即使我不被允许命名类型Foo::Bar,它工作得很好auto...


诺亚写道:

类定义中定义的类型名称不能在没有限定的情况下在类外部使用。

只是为了好玩,以下是从外部获取类型的方法:

#include <type_traits>

const Foo some_foo();

typedef typename std::remove_pointer<decltype( some_foo().operator->() )>::type Foo_Bar;

试图在标准中找到任何可以详细说明的内容,但我找不到。我唯一能找到的是9.9:

类型名称遵循与其他名称完全相同的范围规则。特别是,在类定义中定义的类型名称不能在没有限定的情况下在其类外部使用。

本质上,nameFoo::Bar 是 Foo 私有的,而不是定义。因此,您可以在 Foo 之外使用 Bar,只是不能按类型引用它们,因为该名称是私有的。

成员的姓名查找规则似乎对此也有一些影响。我没有看到任何专门引用“嵌套类”的内容,因此它们不会被允许(如果我实际上找不到任何东西是因为它不存在)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

委托给私有部分 的相关文章

随机推荐