C++ 在模块中“使用”

Yam*_*ari 9 c++ c++20

头文件中“使用命名空间”被认为是不好的做法的原因之一(为什么“使用命名空间 std;”被认为是不好的做法?)是因为它将 using 指令“泄露”给包含头文件的每个人。C++ 模块仍然是这种情况吗?或者我可以“安全地”将 例如using namespace stdusing std::cout放入我的模块中吗?:

module;
#include <iostream>
export module Module;

using namespace std;
// using std::cout;
export void greet() {
    cout << "Hello World!\n";
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 3

using任何此类声明的范围都是正在编译的翻译单元。所有模块文件(以某种形式的模块声明开头的文件)都是一个单独的翻译单元。所以它就像export模块中任何其他非 ed 声明一样:对于它来说是本地的。

话虽如此,这只是要避免的原因之一using namespace std;还有很多其他的。它会对名称查找造成严重破坏。包含的名称可能与全局名称和命名空间中使用的名称冲突。等等。

然而,对命名空间using的特定组件使用声明std要合理得多,因为不这样做的主要原因是为了防止泄漏。此外,对于、namespace等子命名空间来说,别名也是一个好主意。std::chronostd::filesystem

  • 请注意,与 *using-declaration*s 不同,您不能在(已发布的)C++20 中导出 *using-directive*s(尽管可以想象,事后这可能被视为缺陷),除非具有它们位于标题单元中(一切都在其中)。 (3认同)