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
optnamespace
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)
很好的答案。我从没想到这会这么容易。非常感谢。你可以自己回答这个问题。这将使该职位得以解决。