3.4.1/6 是否忽略了在函数的参数声明子句中找到的函数中使用的名称的查找?
Does 3.4.1/6 ignore the lookup of a name used in a function which is found in the function's parameter-declaration-clause?
3.4.1/6:
函数定义中使用的名称,紧跟在函数的 声明符 ID28,它是命名空间
N
的成员(其中,仅用于公开目的,N
可以表示全局 范围)应在在其所在的块中使用之前声明 已使用或在其封闭块之一(6.3)中,或应声明 在命名空间中使用之前N
或者,如果N
是嵌套命名空间,则应 在N
的一个封闭命名空间中使用之前声明。[ 示例:
namespace A { namespace N { void f(); } } void A::N::f() { i = 5; // The following scopes are searched for a declaration of i: // 1) outermost block scope of A::N::f, before the use of i // 2) scope of namespace N // 3) scope of namespace A // 4) global scope, before the definition of A::N::f }
我相信 3.4.1/6 忽略了在函数的参数声明子句中找到的函数体中使用的名称的查找,如下所示:
void f(int i) { std::cout << i << 'n'; }
该段落与您的示例无关,因为在您的示例中,
i
不是"名称 [...]那是命名空间N
的成员"
句子的开头应该像这样解析:
设 F 为函数。
设 N 为命名空间。
让 X 成为一个名字。
如果在 F 的声明符 id 之后的 F 定义中使用 X,并且 X 是命名空间 N 的成员......
编辑:我被评论说服了,我上面的解释是错误的。我创建了 https://github.com/cplusplus/draft/issues/451 来请求改写该段落。
然而,这也是错误的:
我相信 3.4.1/6 忽略了在函数的参数声明子句中找到的函数体中使用的名称的查找,
首先,显然i
是通过名称查找找到的,否则函数参数将不可用!
其次,3.3.3 [basic.scope.block]/2 说i
有"块作用域",从它的声明点开始,到函数定义的右大括号结束。 3.4.6/6说"应在使用它的块中使用之前声明",在这种情况下也是如此。 i
在使用之前声明(其声明点在使用之前),并在使用它的块(函数的最外层块范围)中声明。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 3.4.1/6 是否忽略了在函数的参数声明子句中找到的函数中使用的名称的查找?
- C++ 我需要在任何地方为函数编写 throw 子句吗?
- C++11 标准中的哪个子句支持在下面的函数 foo() 的返回中调用移动构造函数
- 我可以写一个类似于简化函数模板的catch子句吗?
- 将存储在std::function中的带有捕获子句的lambda转换为原始函数指针