使用 auto 访问类的私有结构

Dev*_*iti 6 c++ c++11

我发现下一个奇怪的代码编译并运行(在 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以我的问题是:

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

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

Emm*_*mef 5

的结果Test::WeirdFunc()是一个Priv. 这也是自动扣除类型的val。该关键字消除了命名to be类型的auto必要性,因此编译器不会抱怨。因此,是(未提及的)类型,并且有一个可以自由访问的公共成员。valPrivvalPriva

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

另请参阅:嵌套类的 cpp 参考