在自由功能中定义的类型,可通过自动外部访问.语言错误或功能?

Dar*_* CH 3 c++ c++14

让我们在自由函数中定义一个类,并在外部访问它:

#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)

Lig*_*ica 7

标准没有具体说明这一点,除了 - 正如你已经指出的那样 - 它是具有范围的名称,而不是类型.使用auto绕过类型的名称,无论名称的范围如何,都可以让您获得类型.

它类似于制作嵌套类private并不意味着你不能使用它的实例,只是你不能在封装类的范围之外命名它.

我不知道你是如何"阻止"它,也不是你想要的.