让我们在自由函数中定义一个类,并在外部访问它:
#include <iostream>
auto myFunc(){
class MyType{public: int i = 0; int j = 1;};
return MyType();
}
int main() {
auto my_type = myFunc();
std::cout << my_type.i << " " << my_type.j << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译,按预期运行:
0 1
Run Code Online (Sandbox Code Playgroud)
名称MyType已正确隐藏:如果我们替换auto,则以下内容将无法编译:
int main() {
MyType my_type = myFunc();
std::cout << my_type.i << " " << my_type.j << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
标准对此有何评价?
怎么预防呢?以下代码没有帮助:
namespace{
auto myFunc(){
class MyType{public: int i = 0; int j = 1;};
return MyType();
}
}
int main() {
auto my_type = myFunc();
std::cout << my_type.i << " " << my_type.j << "\n";
// your code goes here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
标准没有具体说明这一点,除了 - 正如你已经指出的那样 - 它是具有范围的名称,而不是类型.使用auto绕过类型的名称,无论名称的范围如何,都可以让您获得类型.
它类似于制作嵌套类private并不意味着你不能使用它的实例,只是你不能在封装类的范围之外命名它.
我不知道你是如何"阻止"它,也不是你想要的.