为什么这段代码有效?使用 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;
}
a
类型如何在 main 中可见?如果我将 auto x=
更改为 a x=
它显然不会编译,但是 main 如何知道 a
类型?
static
声明在那里,因为我试图测试其他东西,但后来我偶然发现了这种行为。
最佳答案
在您意识到这一点之前,这一切都是令人惊讶的:name 可见性不会隐藏类型。它只是隐藏类型的名称。一旦理解了这一点,一切就都说得通了。
我可以在没有 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
}
如果仔细观察,您会发现这与您的情况相同:
你有一个 Hidden
结构,它是 fun
的本地结构。然后你在 test
中使用一个 Hidden
类型的对象:你调用 fun
返回一个 Hidden
obj 然后你将此对象传递给 fun2
,而 fun2
可以毫无问题地使用对象 Hidden
。
正如@Barry 所建议的,当您从类中返回一个私有(private)类型的实例时,同样的事情也会发生。所以我们从 C++03 开始就有了这种行为。你可以自己试试。
关于在 main 中可见的函数中声明的 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738036/