【问题标题】:Why does C++ forbid forward declarations of non-template std:: types?为什么 C++ 禁止非模板 std:: 类型的前向声明?
【发布时间】:2021-10-21 09:57:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 那些类型可能是别名...
  • @Jarod42 你的意思是 std::string 是 basic_string 的 typedef?我也可以禁止这些。但我猜有些类型在 std:: 中确实不是模板
  • @vll Herb 肯定有幽默感,至少在 2021 年阅读时是如此。幸运的是,前向声明字符串和 ostream 在实践中并不是什么大问题,因为它们通常很小并且被广泛使用。大多数标准标题也是如此。"

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我讨厌自己问这个问题,但是为什么标准将它描述为一个类,然后允许别名。是否没有要求将指定为类的东西实现为类?
  • 我知道asif规则,但这似乎不是,增加了使用限制。
  • @NoSenseEtAl - _Internal_detail::_PthreadMutex 一个类,具有标准描述的所有行为。但不要求名称 std::mutex 本身就是一个类。概要页面是说明性的,不是硬性要求。标准库的实现已经够难了。通过强制std::mutex 成为一个适当的类,该标准可能会给实现者带来困难。它不希望这样,因为没有快乐的实现者的 C++ 是一门死语言。
猜你喜欢
  • 2012-02-17
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多