【发布时间】:2018-07-28 19:22:09
【问题描述】:
int i;
void f()
{
int i{};
{
int a = i; // local or global 'i'?
}
}
我的问题不是选择哪个i,因为很明显它是本地的,而是指定的标准中的哪个位置。
我能找到的最接近的规则是[basic.lookup.unqual]p6,上面写着:
在作为命名空间 N 成员的函数的定义中,在函数的 declarator-id 之后使用的名称应在使用它的块中或在一个块中使用之前声明它的封闭块 ([stmt.block]) 或应在其在命名空间 N 中使用之前声明,或者,如果 N 是嵌套命名空间,则应在其在 N 的封闭命名空间之一中使用之前声明。
但它只是说必须在使用前的某个时间声明名称;这不是我要找的。同一段中的示例使一切都更加清晰,因为它说明了按什么顺序搜索了哪些范围,但它是一个示例,因此不是主格的。
[basic.lookup.unqual] 中的所有其他段落都不适用于非成员函数。所以我的问题是这个标准在哪里指定?
【问题讨论】:
-
@melpomene 这只是描述了实体的范围,而不是名称查找 IIUC 的工作原理。
-
是的,但是名称查找 looks in scopes,在您的示例中,全局
i不在范围内(根据我的其他链接)。 -
@melpomene 哦哦哦我明白了。我误读了那部分。现在它是有道理的...... :)(可能想写一个答案顺便说一句)
标签: c++ scope language-lawyer name-lookup