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

C++ 命名空间外函数定义的参数类型查找,c++,language-lawyer,c++17,C++,Language Lawyer,C++17,我所领导的软件项目偶尔会使用嵌套的名称空间作为一种手段,表明库的哪些部分是内部的,不应该被认为是面向用户的。例如: namespace project::detail { // Hands off; library implementation internals class Internal {}; int important_number(Internal internals); } 在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
嵌套命名空间中声明和定义的,但不需要完全限定参数类型(即):

我已经搜索了C++14标准的一些细节,但还没有找到支持缩写函数定义的地方(上面的第一个示例)。我假设C++17的相关规则没有改变。有人能告诉我C++14/17标准的哪些规则适用于这里吗?例如,该标准在哪里支持命名空间外函数定义的非完全限定参数类型?

您正在查找非限定名称查找,可以在下面的标准中找到它

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


为了将来的参考,cppreference.com给出了这种情况下的特殊规则,因为我在解析句子时遇到了困难——这似乎是指“块”或嵌套“块”中使用的名称。但这是在块之前使用类型名——即在函数类型中。我错了什么?standardese基本上说在
重要编号
中使用的
内部
声明必须出现在嵌套的命名空间
细节
中,然后才能被
重要编号
的定义使用(它是)。因此,非限定名称查找将成功搜索
项目的嵌套
详细信息
命名空间
,并找到
内部
@KyleKnoepfel我认为
块中使用它
封闭块
基本上只参考函数体中局部变量声明的情况。它们实际上不适用于参数列表。
int
project::detail::important_number(/*unnecessary*/ project::detail::Internal)