为什么这段代码有效?同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声明是有,因为我是想测试别的东西,但后来我偶然发现了这种行为.
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开始就有这种行为.你可以自己试试.
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |