C++ 我一直在试图从编译器那里得到关于这两种结果的解释,引用了标准中的一些话,但到目前为止没有任何效果

C++ 我一直在试图从编译器那里得到关于这两种结果的解释,引用了标准中的一些话,但到目前为止没有任何效果,c++,namespaces,language-lawyer,C++,Namespaces,Language Lawyer,: 未命名的命名空间定义的行为就像它被替换为 inlineoptnamespaceunique{/*empty body*/} 使用命名空间唯一 namespace-unique{namespace-body} 其中inline仅当它出现在 未命名的命名空间定义和翻译单元中出现的所有unique都将替换为相同的标识符,并且 标识符不同于翻译单元中的所有其他标识符。 中的可选属性说明符seq 未命名的命名空间定义与unique关联 我在SO中使用了@Johannes Schaub-litb给出的示

:

未命名的命名空间定义的行为就像它被替换为

inline
opt
namespace
unique
{/*empty body*/}

使用命名空间唯一
namespace-unique{namespace-body}

其中
inline
仅当它出现在 未命名的命名空间定义和翻译单元中出现的所有unique都将替换为相同的标识符,并且 标识符不同于翻译单元中的所有其他标识符。 中的可选属性说明符seq 未命名的命名空间定义与unique关联

我在SO中使用了@Johannes Schaub-litb给出的示例:

如果根据上面给出的[namespace unnamed]/1替换未命名的名称空间定义,则得到以下代码:

namespace A { void f(long); }
using namespace A;

namespace unique {}
using namespace unique;
namespace unique {
  void f(int);
  void g() {
    ::f(0);
  }
}

int main(){
    g();
}
namespace A { void f(long); }
using namespace A;

namespace unique {
  void f(int);
  void g() {
    ::f(0);
  }
}
using namespace unique;

int main(){
    g();
}
这表明函数
g()
调用
unique::f(int)
,如图所示

如果我将代码中未命名的命名空间定义替换为

名称空间唯一{namespace body}

使用命名空间唯一

我得到以下代码:

namespace A { void f(long); }
using namespace A;

namespace unique {}
using namespace unique;
namespace unique {
  void f(int);
  void g() {
    ::f(0);
  }
}

int main(){
    g();
}
namespace A { void f(long); }
using namespace A;

namespace unique {
  void f(int);
  void g() {
    ::f(0);
  }
}
using namespace unique;

int main(){
    g();
}

这表明函数
g()
现在调用
A::f(long)
,正如所见,并证实了@Johannes Schaub在回答中所说的。我一直试图在标准中找到编译器对这两种不同行为的解释,但都没有用。

:f(0)
明确表示“在全局命名空间中搜索
f
”。此时,在全局名称空间中唯一可见的名为
f
的实体是
A::f
(因为
使用了namespace unique;
指令,它允许在全局名称空间中查找
unique::f
,但还没有看到)。@IgorTandetnik这很好。但是为什么它在第一个代码中找到
f(int)
,而没有找到
f(long)
?它同时找到这两个,然后重载解析确定
f(int)
int
类型的参数
0
更匹配
f(0L)
应该调用
A::f(long)
很好的答案。我从没想到这会这么容易。非常感谢。你可以自己回答这个问题。这将允许解析帖子。
:f(0)
明确表示“在全局命名空间中搜索
f
”。此时,在全局名称空间中唯一可见的名为
f
的实体是
A::f
(因为
使用了namespace unique;
指令,它允许在全局名称空间中查找
unique::f
,但还没有看到)。@IgorTandetnik这很好。但是为什么它在第一个代码中找到
f(int)
,而没有找到
f(long)
?它同时找到这两个,然后重载解析确定
f(int)
int
类型的参数
0
更匹配
f(0L)
应该调用
A::f(long)
很好的答案。我从没想到这会这么容易。非常感谢。你可以自己回答这个问题。这将使该职位得以解决。