小编Ric*_*ish的帖子

C++ 模块中命名空间内的“using”不限于命名空间

给定以下模块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++ c++20 c++-modules

18
推荐指数
1
解决办法
985
查看次数

c++20前后指定初始化器的不同行为

我遇到了这种奇怪的行为,我找不到很好的解释。

下面的代码会在 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 中的哪些更改导致此代码无法编译?

c++

8
推荐指数
1
解决办法
69
查看次数

标签 统计

c++ ×2

c++-modules ×1

c++20 ×1