我发现下一个奇怪的代码编译并运行(在 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”,它也可以工作
所以我的问题是:
所有这些显然都是糟糕的代码风格,但我很好奇它是否是有效的 C++ 代码
的结果Test::WeirdFunc()是一个Priv. 这也是自动扣除类型的val。该关键字消除了命名to be类型的auto必要性,因此编译器不会抱怨。因此,是(未提及的)类型,并且有一个可以自由访问的公共成员。valPrivvalPriva
因此,您所有问题的答案是:是的(只要您不“提及”嵌套类的名称)。
另请参阅:嵌套类的 cpp 参考