首页 > 解决方案 > 为什么 C++ 禁止非模板 std:: 类型的前向声明?

问题描述

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

我认为没有充分的理由这样做,所以我想知道动机是什么?

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

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

标签: c++c++20forward-declaration

解决方案


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

你怎么知道的?该标准将其描述为一个类,但没有什么能阻止实现者做

namespace std {
    using mutex = _Internal_detail::_PthreadMutex;
}

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

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


推荐阅读