You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2022中C++ Modules是否存在编译器Bug?

C++20模块同名导出函数的编译行为问题

这确实是Visual Studio 2022 Community 17.5.3版本的非标准行为,按照C++20标准,你的代码本应在编译阶段就因名称歧义报错,而不是根据导入顺序选择其中一个hello()函数执行。

标准规则说明

C++20模块规范明确要求:当多个导入的模块在同一作用域导出同名实体时,引用该名称属于歧义,编译器必须在编译阶段诊断并拒绝编译。导入顺序并不影响名称解析的结果——模块导入只是将实体引入当前作用域,多个同名实体共存必然导致调用歧义,不存在“按顺序选择”的规则。

MSVC的实现缺陷

你观察到的“导入顺序决定调用哪个函数”的行为,完全不符合C++20标准,属于MSVC在模块功能实现上的bug。后续版本的Visual Studio大概率会修复这个问题,对齐标准要求。

符合标准的正确写法

要避免这类问题,你应该给模块中的函数加上命名空间,明确区分不同模块的实体:

hello1.ixx

export module hello1;

import <iostream>;

export namespace hello1 {
void hello() {
  std::cout << "Hello, world from hello1\n";
}
}

hello2.ixx

export module hello2;

import <iostream>;

export namespace hello2 {
void hello() {
  std::cout << "Hello, world from hello2\n";
}
}

main.cpp

import hello1;
import hello2;

int main() {
  hello1::hello();
  hello2::hello();
  return 0;
}

这样代码既能明确调用目标函数,也完全符合C++20模块的规范,不会再出现编译器的非标准行为。

内容的提问来源于stack exchange,提问作者j.karlsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:32:08