gpt4 book ai didi

c++ - 使用 auto 访问类的私有(private)结构

转载 作者:行者123 更新时间:2023-12-03 06:51:28 24 4
gpt4 key购买 nike

我发现下一个奇怪的代码编译并运行(在 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 关键字允许我们访问私有(private)结构“Priv”。
如果我尝试用 Test::Priv 替换 auto ,我会得到编译错误,正如预期的那样。
从互联网上的文章中,我发现您可能必须将 auto 用于 lambda,但从未提及这种情况。
另外,如果我尝试输出“Test::WeirdFunc().a”,它也可以工作
所以我的问题是:
  • auto 让我们访问私有(private)结构/类是预期的行为吗?
  • 是否允许声明返回私有(private)结构的公共(public)函数?
  • 如果它是函数的返回值(例如“Test::WeirdFunc().a”),我们可以访问私有(private)结构/类是预期的行为吗?

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

    最佳答案

    Test::WeirdFunc() 的结果是 Priv .这也是 val 的自动扣除类型. auto关键字消除了命名 val 类型的必要性成为 Priv因此,编译器不会提示。结果,val属于(未提及的)类型Priv并且有一个公共(public)成员 a ,可以自由访问。
    因此,您所有问题的答案都是:是的(只要您不“提及”嵌套类的名称)。
    另见:cpp reference on nested classes

    关于c++ - 使用 auto 访问类的私有(private)结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64498385/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com