[英]Why does C++ parameter scope affect function lookup within a namespace?
[英]Parameter type lookup for out-of-namespace function definitions
我偶尔使用的软件项目使用嵌套命名空间作为指示库的哪些部分是内部的,不应该被认为是面向用户的手段。 例如:
namespace project::detail {
// Hands off; library implementation internals
class Internal {};
int important_number(Internal internals);
}
在C ++ 17之前,缩进会变得有些可怕(取决于源代码格式化),因此我们选择在命名空间之外定义函数:
int
project::detail::important_number(Internal const internals)
{ ... }
注意虽然在project::detail
嵌套命名空间中声明和定义了Internal
类型,但不需要完全限定参数类型(即):
int
project::detail::important_number(/*unnecessary*/ project::detail::Internal)
我已经浏览了en.cppreference.com和C ++ 14标准的部分,但没有找到支持缩写函数定义的地方(上面的第一个例子)。 我假设相关规则没有改变C ++ 17。 谁能告诉我C ++ 14/17标准的哪些规则适用于此 - 即标准在哪里支持非命名空间函数定义的非完全限定参数类型?
您正在寻找不合格的名称查找 ,它可以在basic.lookup.unqual下的标准中找到
在作为名称空间
N
的成员的函数的定义中,在函数的declarator-id之后使用的名称应在使用它之前在其使用的块中或在其封闭块之一中声明,或者应在其声明之前声明。在名称空间N
使用,或者,如果N
是嵌套名称空间,则应在N
的封闭名称空间中使用之前声明它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.