为什么允许函数体内有函数声明

Cap*_*ffe 5 c++

为什么语法允许在函数体内声明函数?

它确实在这里产生了很多问题,其中函数声明被误认为是变量初始化等。

a object();
Run Code Online (Sandbox Code Playgroud)

更不用说最令人烦恼的解析了。

是否有任何用例无法通过命名空间和成员等更常见的范围隐藏手段轻松实现?

是因为历史原因吗?

附录:如果由于历史原因,从C继承来限制范围,禁止它们有什么问题?

Mat*_*son 2

虽然许多 C++ 应用程序仅用 C++ 代码编写,但也有很多代码是 C 和 C++ 代码的混合。这种混合绝对是 C++ 实用性的重要组成部分(包括与现有 API 的“简单”接口,从 OpenGL 或 cURL 到用 C 编写的自定义硬件驱动程序的任何内容,几乎都可以直接使用,只需很少的努力,其中尝试将自定义硬件 C 驱动程序连接到 Basic 解释器是相当困难的)

如果我们开始通过删除“没有特定价值”的东西来破坏兼容性,那么 C++ 就不再那么有用了。除了在令人困惑的情况下提供更好的错误消息(这当然本身很有用)之外,很难看出 REMOVE this 有什么用 - 当然,这是假设没有 C++ 本身使用它 - 我不会如果即使在现代代码中有时也会发生这种情况(无论出于好或坏的原因),请不要感到惊讶。

一般来说,C++ 非常努力地不破坏向后兼容性——在我看来,这是一件好事。这就是为什么关键字static用于一堆不同的东西,而不是添加一个新的关键字,并且auto现在的含义与 C 中的过去不同,但它不是一个“新”关键字,可能会破坏碰巧使用任何东西的现有代码另一个词“选择”(这是一个小小的突破,但无论如何,在过去的 20 年里没有人真正使用过它)。

  • @LightnessRacesinOrbit 也许不是完美语言的意义上,但作为一个有用的工具,它肯定是。 (2认同)
  • @LightnessRacesinOrbit 确实如此,但我发现 Mats 的论点令人信服。 (2认同)