Ric*_*ish 18 c++ c++20 c++-modules
给定以下模块example
module;
#include "example.h" // `namespace cxx { struct example {}; }`
export module example;
export namespace cxx::containers
{
using cxx::example;
}
Run Code Online (Sandbox Code Playgroud)
cxx::containers::examplecxx::example也可以从我只希望cxx::containers::example出现的地方访问。
import example;
int main()
{
auto v1 = cxx::containers::example();
auto v2 = cxx::example();
}
Run Code Online (Sandbox Code Playgroud)
cxx::example即使我只在命名空间内使用它cxx::containers::example并且#include全局module;片段中的指令应该本地化到它们的模块,但它仍然可见的原因是什么?
严格的答案(“可见的原因cxx::example”)是它是一个MSVC bug:未导出 的声明cxx::example,因此在相关模块外部通过名称查找找不到它([basic.lookup.general]/ 2.3,除非在某些涉及依赖 ADL\xc2\xa0([basic.lookup.argdep]/4)) 的情况下。
自 C++20 发布以来,using-declaration的措辞已进行了重大修改,以澄清原始声明和新声明之间的关系。using 声明不是原始实体或 typedef 的重新声明(这就是它可以单独导出的原因);相反,名称查找将using -declarator替换为其引用的声明\xc2\xa0([basic.lookup.general]/3)。using声明优先,因为它是导出\xc2\xa0(/2.3);其自身的声明没有,因此找不到\xc2\xa0([basic.lookup.qual.general]/3, [class.member.lookup]/1, 以及 [basic.lookup.一般]/3) 除非通过上述替换。cxx::containers::example maincxx::example
唯一相关性较远的using 指令的措辞也已更改(作为追溯缺陷报告),以通常允许导出的using 指令s\xc2\xa0([basic.lookup.unqual]/1, [namespace.质量]/1,[模块.接口]/4)。(它们可能已经以标头单元导出。)当然,如果您不\xe2\x80\x99t导出它们,您可以在模块中使用它们只是为了方便,而不会影响您的客户端!
\n| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |