在函数中声明的C++结构在main中可见

PYA*_*PYA 10 c++ c++14

为什么这段代码有效?同c++14

// Example program
#include <iostream>
#include <string>
using namespace std;


auto fun()
{
    struct a
    {
        int num = 10;
        a()
        {

            cout << "a made\n";
        }
        ~a()
        {
            cout << "a destroyed\n";
        }
    };
    static a a_obj;
    return a_obj;
}


int main()
{
    auto x = fun();
    cout << x.num << endl;

}
Run Code Online (Sandbox Code Playgroud)

主要的类型如何a?如果我auto x=改为a x=它显然不编译,但主要知道该类型a

static声明是有,因为我是想测试别的东西,但后来我偶然发现了这种行为.

在这里运行:https://wandbox.org/permlink/rEZipLVpcZt7zm4j

bol*_*lov 12

在您意识到这一点之前,这一切都令人惊讶:名称可见性不会隐藏类型.它只是隐藏了类型的名称.一旦你理解了这一切,这一切都有道理.

我可以auto通过简单的旧模板向您展示:

auto fun()
{
    struct Hidden { int a; };

    return Hidden{24};
}

template <class T> auto fun2(T param)
{
    cout << param.a << endl; // OK
} 

auto test()
{
    fun2(fun()); // OK
}
Run Code Online (Sandbox Code Playgroud)

如果你仔细观察,你会发现这与你的情况相同:

你有一个Hidden本地的结构fun.然后你Hidden在里面使用一个类型的对象test:你调用fun哪个返回一个Hiddenobj,然后你将这个对象传递给fun2它反过来完全没有任何问题在Hidden它的所有荣耀中使用该对象.

正如@Barry建议的那样,当您从类中返回私有类型的实例时会发生同样的事情.所以我们从C++ 03开始就有这种行为.你可以自己试试.