C++ 使用MSVC的模块中的访问冲突

C++ 使用MSVC的模块中的访问冲突,c++,c++20,C++,C++20,我非常渴望尝试C++20模块特性,但在运行时遇到了访问冲突。我能够将其简化为下面的最小示例。它与clang一起工作,但在Microsoft编译器中遇到上述av。这可能是一个带有此实验功能的编译器错误,但也许我只是用错了? 下面的命令行不会生成任何调试符号。我查看了Visual Studio调试器的错误: main.exe中0x00007FF7222E1027处引发异常:0xC0000005:Access 读取位置0x000027AB00000021时发生冲突 我在内存视图中检查了上述位置,它看起

我非常渴望尝试C++20模块特性,但在运行时遇到了访问冲突。我能够将其简化为下面的最小示例。它与clang一起工作,但在Microsoft编译器中遇到上述av。这可能是一个带有此实验功能的编译器错误,但也许我只是用错了?
下面的命令行不会生成任何调试符号。我查看了Visual Studio调试器的错误:

main.exe中0x00007FF7222E1027处引发异常:0xC0000005:Access 读取位置0x000027AB00000021时发生冲突

我在内存视图中检查了上述位置,它看起来确实像未映射的内存

系统:Windows Server 2019,x64,版本10.0.17763构建17763
CL编译器:Visual Studio 2019,针对x64的Microsoft(R)C/C++优化编译器版本19.25.28612
Clang编译器:Clang版本10.0.0,目标:x86_64-pc-windows-msvc

fstmod.ixx:

export module fstmod;
export struct SampleFstMod {
  SampleFstMod(const char* pData) {}
};
sndmod.ixx:

export module sndmod;
import fstmod;
export struct SampleSndMod {
  SampleSndMod(SampleFstMod name = "SampleString") {}
};
main.cxx:

import sndmod;
int main(int, const char**) {
  SampleSndMod variable;
  return 0;
}
对于clang,此示例适用于:

clang++ -fmodules-ts --precompile -x c++-module sndmod.ixx -o sndmod.pcm fstmod.pcm
clang++ -fmodules-ts --precompile -fprebuilt-module-path=. -x c++-module sndmod.ixx -o sndmod.pcm
clang++ -fmodules-ts --verbose -fprebuilt-module-path=. main.cxx -o main.exe
main.exe
使用MSVC进行转换会在运行时产生访问冲突:

cl /EHsc /MDd /std:c++latest /experimental:module /c fstmod.ixx
cl /EHsc /MDd /std:c++latest /experimental:module /c sndmod.ixx
cl /EHsc /MDd /std:c++latest /experimental:module main.cxx fstmod.obj sndmod.obj
main.exe
编辑:
我在问:

  • 为什么错了?
    • 也许是因为它在叮当作响
  • 哪个/哪里是导致av的非法指针解引用
  • 为什么它在没有警告的情况下编译?一旦其他问题得到解决,我可能会发现一个开关在这里启用警告

注意,我检查了反汇编,它发生在调用后取消引用eax的值时,这是在计算返回参数

这既没有错也没有错。它应该编译得很好,没有警告。

这确实是一个编译器问题。根据他们的说法,它将在16.7预览版1中修复

这既没有错也没有错。它应该编译得很好,没有警告。

这确实是一个编译器问题。根据他们的说法,它将在16.7预览版1中修复

您正在为SampleFstMod对象分配一个sting文本。这没有多大意义。我想你想做的是SampleSndMod(SampleFstMod(“SampleString”))为什么有两个构造函数,一个是const char*,另一个是struct type name?@goaran是的,没错。我想要一个SampleFstMod作为可选参数。如果未设置,我希望使用特定的const char*构造一个。另外,这似乎不是特定于模块的问题,很抱歉这个误导性的标题…@Mannoj它只是一个与我预期相矛盾的最小示例,而不是真实世界的代码。那么构造函数应该是SampleSndMod(SampleFstMod sfm=SampleFstMod(“SampleString”){}您正在为SampleFstMod对象分配一个sting文本。这没有多大意义。我想你想做的是SampleSndMod(SampleFstMod(“SampleString”))为什么有两个构造函数,一个是const char*,另一个是struct type name?@goaran是的,没错。我想要一个SampleFstMod作为可选参数。如果未设置,我希望使用特定的const char*构造一个。另外,这似乎不是特定于模块的问题,很抱歉这个误导性的标题…@Mannoj它只是一个与我预期相矛盾的最小示例,而不是真实世界的代码。那么构造函数应该是SampleSndMod(SampleFstMod sfm=SampleFstMod(“SampleString”){}