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

type defined in free function, accessible through auto outside. Language Bug or Feature?

本文关键字:访问 外部 语言 错误 功能 可通过 函数 自由 定义 类型      更新时间:2023-10-16

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

#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;
}

它编译,按预期运行:

0 1

名称MyType已正确隐藏:如果我们替换auto,以下内容将无法编译:

int main() {
    MyType my_type = myFunc();
    std::cout << my_type.i << " " << my_type.j << "n";
    return 0;
}

标准对此有何规定?

如何预防?以下代码没有帮助:

 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;
}

标准没有具体说明这一点,除了—正如您已经指出的那样—有作用域的是名称,而不是类型。auto的使用绕过了类型的名称,为您提供了一种获取类型的方法,而不管名称的作用域如何。

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

我不知道你会如何"阻止"它,也不知道你为什么要这样做。