在自由函数中定义的类型,可通过自动外部访问.语言错误或功能
type defined in free function, accessible through auto outside. Language Bug or Feature?
让我们在一个自由函数内部定义一个类,并在外部访问它:
#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
并不意味着不能使用它的实例,只是不能在封装类的范围之外命名它。
我不知道你会如何"阻止"它,也不知道你为什么要这样做。
相关文章:
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 访问 PlatformIO 中的外部环境变量
- 如何在函数外部访问函数中局部变量的值?
- Windows C++静态库在初始化期间无法访问外部方法
- C++使用其他命名空间中的符号,而不使它们可从外部访问
- 从内部类访问外部公共成员
- 从不同的标头访问外部结构成员
- C 可以从继承链中访问外部会员
- 在lambda中访问外部范围名称,是G 或视觉范围或不正确的
- 如何使用LLVM访问外部结构?
- 使用线程控制访问外部API的对象
- 使用JNI访问外部本机功能
- 从外部函数访问外部结构属性
- 为什么局部类定义可以从同一函数访问外部静态变量
- 如何避免私有成员通过类对象访问外部单词
- 这段代码如何访问C++外部的局部变量
- 访问外部进程的内存
- 在c++中是否有办法访问外部作用域中的局部变量?
- 我如何使用OpenCV访问外部网络摄像头?
- 访问外部浮点数组时遇到问题