使用 auto 访问类的私有结构

2023-12-02

我发现下一个奇怪的代码编译并运行(在 VS 2019 上):

#include <iostream>

class Test
{
    private:
    struct Priv
    {
        int a;
    };
    
    public:
    static Priv WeirdFunc() {return {42};}; 
};

int main()
{
    auto val = Test::WeirdFunc();
    std::cout << val.a;
}

输出是42,这里没有问题。

我看到的问题是 auto 关键字允许我们访问私有结构“Priv”。 如果我尝试用 Test::Priv 替换 auto,则会出现编译错误,如预期的那样。 从互联网上的文章中,我发现您可以必须使用 auto 来表示 lambda,但这种情况从未被提及。

另外,如果我尝试输出“Test::WeirdFunc().a”,它也可以工作

所以我的问题是:

  • auto 让我们访问私有结构/类是预期的行为吗?
  • 是否允许声明返回私有结构的公共函数?
  • 如果它是函数的返回值(例如“Test::WeirdFunc().a”),我们可以访问私有结构/类,这是预期的行为吗?

所有这些显然都是糟糕的代码风格,但我很好奇它是否是有效的 C++ 代码


的结果Test::WeirdFunc() is a Priv。这也是自动扣除类型val. The auto关键字消除了必要性name的类型val to be Priv因此,编译器不会抱怨。因此,val属于(未提及的)类型Priv并有一个public member a,可以自由访问。

所以你所有问题的答案是:Yes,(只要您不“提及”嵌套类的名称)。

也可以看看:嵌套类的cpp参考

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

使用 auto 访问类的私有结构 的相关文章

随机推荐