为什么 C++ 禁止前向声明非模板 std:: 类型?

NoS*_*tAl 4 c++ forward-declaration c++20

C++ 标准不允许代码在名称空间中转发声明类std,即使它们不是模板。

我看不出这样做的充分理由,所以我想知道动机是什么?

这可能是一个巨大的编译时间改进。例如,std::mutex这是一个简单的类,但<mutex>标头拖入了大量内容(至少在我的实现中)。

如果有人想知道为什么我要区分模板和非模板,那么这是因为模板实例化可能根据提供的模板参数而存在显着差异,所以我想这可能更难以实现/支持。

Sto*_*ica 6

例如std::mutex是一个简单的类

你怎么知道?标准将其描述为一个类,但没有什么可以阻止实现者这样做

namespace std {
    using mutex = _Internal_detail::_PthreadMutex;
}
Run Code Online (Sandbox Code Playgroud)

当然,我省略了一些关于何时应该设置此别名的检查(可能非常详细且对专家友好)。但这是一种有效的实现技术!

现在,如果您添加前向声明,您将收到错误,因为别名和类是不同的东西。这使得此类前向声明​​本质上是不可移植的,因此,它们被认为会产生未定义的行为。

  • @NoSenseEtAl - `_Internal_detail::_PthreadMutex` *是*一个类,具有标准描述的所有行为。但不要求名称“std::mutex”本身是一个类。概要页面是说明,而不是硬性要求。标准库的实现本身就已经足够困难了。通过强制“std::mutex”成为一个类本身,该标准可能会给实现者带来困难。它不希望这样,因为没有快乐的实现者的 C++ 是一种死语言。 (3认同)