为什么不允许在全局命名空间处阻止范围?



我很好奇为什么不允许在任何函数(全局范围内(之外{}创建块作用域。

我能够做到以下几点:

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

最新更新