它会使解析和编译
语言更容易
我不明白怎么做。如果您需要发出诊断,为什么解析和编译i < i > i比解析它更容易,如果您被允许做任何您该死的事情,请提供发出的代码没有副作用?
Java 编译器禁止无法访问的代码(相对于没有效果的代码),这对程序员来说是喜忧参半,并且需要编译器比 C++ 编译器实际需要做的工作稍微多一点(基本块依赖分析)。 C++ 应该禁止无法访问的代码吗?可能不是。尽管 C++ 编译器确实做了足够的优化来识别无法访问的基本块,但在某些情况下它们可能做得太多。如果foo 是错误的编译时常量,if (foo) { ...} 是否应该是非法的不可访问块?如果它不是编译时常量,但优化器已经弄清楚如何计算该值,它是否合法并且编译器必须意识到它删除它的原因是特定于实现的,以免出错?更多特殊情况。
实际上没有人有任何电流
具有 no 表达式的程序
副作用
负载。例如,如果NDEBUG 为真,则assert 扩展为无效表达式,没有任何效果。因此,编译器需要更多的特殊情况来允许 一些 无用的表达式,但不允许其他表达式。
我相信,其基本原理是,如果它扩展为空,那么 (a) 编译器最终会针对 if (foo) assert(bar); 之类的东西发出警告,并且 (b) 像这样的代码在发布时是合法的,但在调试时是不合法的,这只是令人困惑:
assert(foo) // oops, forgot the semi-colon
foo.bar();
最令人头疼的解析之类的事情
这就是为什么它被称为“烦恼”。这确实是一个向后兼容性问题。如果 C++ 现在改变了那些令人烦恼的解析的含义,那么现有代码的含义就会改变。正如您所指出的,现有代码并不多,但 C++ 委员会在向后兼容性方面采取了相当强硬的立场。如果您想要一种每五分钟更改一次的语言,请使用 Perl ;-)
无论如何,现在为时已晚。即使我们有一些 C++0x 委员会遗漏的深刻见解,为什么应该删除或不兼容地更改某些功能,它们也不会破坏 FCD 中的任何内容,除非 FCD 明确错误。
请注意,对于您的所有建议,任何编译器都可能向它们发出警告(实际上,我不明白您对第二个示例的问题是什么,但肯定是因为无用的表达式和函数体中令人烦恼的解析)。如果您是对的,没有人故意这样做,那么警告不会造成任何伤害。如果您认为没有人故意这样做是错误的,那么您声明的删除它们的案例是不正确的。流行编译器中的警告可能会为删除功能铺平道路,特别是因为该标准主要由编译器编写者编写。我们并不总是收到有关这些事情的警告这一事实向我表明,它比您想象的要多。