可以从模块导入 类,将它们用作私有基础 类,但不能重新导出?

Possible to import classes from a module, use them as private base classes, but not re-export?

我试图通过一些玩具示例来确保我正确理解模块。我认为相关的一个用例是实现隐藏,方法是使基础 class 不属于模块的导出部分。

使用 Visual Studio 16.11.2,以下代码的行为符合我的预期:

PublicModule.ixx:

export module PublicModule;

class PrivateImpl
{
protected:
  int x = 7;
};

export class PublicClass : private PrivateImpl
{
public:
  int getX() const { return x; }
};

main.cpp:

#include <iostream>

import PublicModule;

int main()
{
  PublicClass pc;
  std::cout << pc.getX() << '\n'; // Prints 7

  // PrivateImpl pi; // This doesn't compile because PrivateImpl wasn't exported from PublicModule
}

但是,如果我尝试将 class PrivateImpl 移动到它自己的模块中,如下所示:

PrivateModule.ixx:

export module PrivateModule;

export class PrivateImpl
{
protected:
  int x = 7;
};

PublicModule.ixx:

export module PublicModule;

import PrivateModule;

export class PublicClass : private PrivateImpl
{
public:
    int getX() const { return x;  }
};

main.cpp

#include <iostream>

import PublicModule;

int main()
{
  PublicClass pc;
  std::cout << pc.getX() << '\n'; // Prints 7

  PrivateImpl pi; // This compiles, even though main.cpp doesn't import anything 
                  // that (appears to) export  PrivateImpl
}

我以为 import PrivateModule; 会从私有模块导入 PrivateImpl,但 不会 重新导出它,因为我没有说 export import PrivateModule;。而且我不认为仅导出 PublicClass 就足以导出其私人基地,因为第一个版本如我所料。

我是不是误解了模块导出的工作原理?

对于这两个示例,您的理解正确:这显然是一个编译器错误。名称查找不考虑名称是否 used 在其他一些翻译单元中。