我发现下一个奇怪的代码编译并运行(在 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(使用前将#替换为@)