为何未被重导出的std模块仍可在导入模块m的代码中访问?
为何未重导出的std模块在导入其他模块后仍可被访问?
代码示例
module.ixx
export module m; import std; export namespace m { struct Object { std::string_view data() { return "DATA"; } }; }
main.cpp
import m; int main() { m::Object o; std::println("{}", o.data()); return 0; }
模块m导入了std模块,但并未通过export import std将其重导出。按照C++模块的规则,main.cpp仅导入m的情况下,理论上不应直接访问std模块的成员。
编译环境与配置
- 编译器:Visual Studio 2026 内置MSVC 19.50.35729
- 编译选项:
/std:c++latest- 开启一致性模式:
/permissive- - 启用“构建ISO C++23标准库模块”
实际结果
代码编译运行后输出:
DATA
预期与异常情况
原本预期会出现类似'println': is not a member of 'std'的编译错误,但实际代码顺利编译通过。尝试过重建项目、切换Debug/Release/x64等不同配置,结果均一致。
若关闭一致性模式,会触发如下错误:
Modules conflict with non-standard behavior requested via '/Zc:twoPhase-'
请问:为何未被重导出的std模块仍能在main.cpp中被访问?
内容的提问来源于stack exchange,提问作者sanitizedUser
相关产品推荐
相关产品推荐

