我很好奇为什么不允许在任何函数(全局范围内(之外{}
创建块作用域。
我能够做到以下几点:
int main(){
{
int i = 4;
}
//other stuff
}
但不是
{
int i = 4;
}
int main(){
//other stuff
}
这个问题在实现编译时断言时引起了我的兴趣,为此我正在创建一个变量,该变量将在断言逻辑完成后立即销毁(以释放内存(。
我很好奇为什么不允许在任何函数(全局范围内(之外创建块范围{}。
这将是毫无意义和误导性的。 在任何函数之外声明的变量都是静态分配的,因此永远不会超出范围(程序结束时除外(。
编辑:要使变量在程序启动时暂时存在,您可以执行以下操作:
static auto throwaway_name = [] () { MyClass myVar; return 0; } ();
静态分配的唯一内容是int
(我不确定可能会得到优化(。
为什么不允许在全局命名空间阻止范围?
语法只允许在全局命名空间中使用声明语句。没有块语句或表达式语句。
假设语言已更改为允许命名空间范围内的块语句。想想行为应该是什么。这些语句何时执行?按什么顺序?
附言main
必须返回int
.
>
6.3.3 [basic.scope.block]
在块 (8.3( 中声明的名称是该块的本地名称;它有块 范围。其潜在范围从其声明点开始(6.3.2( 并在其块的末尾结束。在块范围内声明的变量 是一个局部变量
全局命名空间作用域中不能有无名称的块作用域。
但是您可以引入命名空间
namespace N {
int i = 4;
}