命名空间外函数定义的参数类型查找

时间:2018-11-29 20:39:55

标签: c++ language-lawyer c++17

我领导的软件项目偶尔会使用嵌套的名称空间来表明库的哪些部分是内部的,而不应视为面向用户。例如:

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) 
{ ... }

请注意,尽管Internal类型是在project::detail嵌套名称空间中声明和定义的,但不需要完全限定参数类型(即):

int
project::detail::important_number(/*unnecessary*/ project::detail::Internal)

我已经搜索了en.cppreference.com和C ++ 14标准的某些位,但是没有找到支持缩写函数定义的位置(上面的第一个示例)。我假设C ++ 17的相关规则没有改变。谁能告诉我C ++ 14/17标准的哪些规则在这里适用-即标准在哪里支持命名空间外函数定义的非完全限定参数类型?

1 个答案:

答案 0 :(得分:2)

您要查找不合格的名称查找,可以在basic.lookup.unqual

下的标准中找到它
  

在作为命名空间N成员的函数的定义中,   在函数的 declarator-id 之后使用的名称应在   它在使用它的块或其中一个块中的使用   块或应在其在命名空间N中使用之前声明,或者   N是一个嵌套的名称空间,应在以下其中一种使用前声明   N的封闭名称空间。