c++ - 为什么 C++ 禁止非模板 std:: 类型的前向声明?
问题描述
C++ 标准不允许代码在命名空间中转发声明类std
,即使它们不是模板。
我认为没有充分的理由这样做,所以我想知道动机是什么?
这可能是一个巨大的编译时间改进。例如std::mutex
是一个简单的类,但<mutex>
标题拖入了大量的东西(至少在我的实现中)。
如果有人想知道我为什么要区分模板和非模板,那是因为模板实例化可能会根据提供的模板参数而显着不同,所以我猜这可能更难以实现/支持。
解决方案
例如
std::mutex
是一个简单的类
你怎么知道的?该标准将其描述为一个类,但没有什么能阻止实现者做
namespace std {
using mutex = _Internal_detail::_PthreadMutex;
}
当然,我省略了一些(可能非常冗长和专家友好的)检查何时应设置此别名。但这是一种有效的实现技术!
现在如果你添加你的前向声明,你会得到一个错误,因为别名和类是不同的东西。这使得这种前向声明本质上是不可移植的,因此,它们被认为会产生未定义的行为。
推荐阅读
- cryptocurrency - 使用php实现bitshares api
- c# - 如何实现字符串相似度算法的数组列表输入?
- java - 模式与文件路径输入不匹配
- android - 从 Google Drive 意图中选择 PDF 或图像文件
- css - HTML/CSS 在第一个 DIV 中指定边框颜色
- html - iText中具有“开始”属性的有序列表
- powershell - 获取 NAS 驱动器信息
- session - Cakephp 3 更新每个请求的会话
- spring-webflux - StepVerifier expectNoEvent for 0ms 不起作用(想检查特殊情况是否有延迟)
- ruby - NoMethodError:DatabaseCleaner:Module 的未定义方法 `url_whitelist='