给定以下模块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;片段中的指令应该本地化到它们的模块,但它仍然可见的原因是什么?
我遇到了这种奇怪的行为,我找不到很好的解释。
下面的代码会在 c++20 之前成功编译,只有在explicit使用时才会失败。
struct Square {
int area = 10;
Square() = default; // only if this is explicit will the compile fail
Square(const Square& other) = delete;
Square(Square&& other) = delete;
Square& operator =(Square&& square) = delete;
Square& operator =(const Square& square) = delete;
};
int main() {
Square s = {
.area = 10
};
}
Run Code Online (Sandbox Code Playgroud)
这本身就很奇怪,但是将编译器转换为 c++20 会使上面的代码失败并显示这些错误消息
海湾合作委员会
无法转换大括号括起来的初始化列表
铛
没有用于初始化“Square”的匹配构造函数
问题:
为什么它在 c++20 之前编译成功,除非explicit?换句话说,会发生什么隐式转换来实现这一点?
c++20 中的哪些更改导致此代码无法编译?