它将使解析&编译 语言更容易
我怎么没看到。为什么分析和编译i <i> i
更容易,如果你需要需要来发布诊断,而不是解析它,如果你被允许做任何你该死的任务,请确保发出的代码没有副作用?
Java编译器禁止无法访问的代码(与无效的代码相反),这对程序员来说是一种混合的祝福,并且需要编译器的额外工作,而不是C++编译器实际需要做的事情(基本块依赖性分析)。 C++应该禁止无法访问的代码?可能不会。尽管C++编译器确实做了足够的优化来识别无法访问的基本块,但在某些情况下,它们可能做得太多。如果foo
是一个错误的编译时常量,if (foo) { ...}
应该是一个非法的不可达块吗?如果它不是一个编译时常量,但是优化器已经计算出如何计算该值,如果它是合法的并且编译器必须认识到它将它移除的原因是特定于实现的,以免给出错误?更特殊的情况。
没有人真正有任何电流 程序,有没有 副作用他们
载荷表达式。例如,如果NDEBUG
为真,那么assert
将扩展为无效表达式,但不起作用。所以在编译器中需要更多特殊情况来允许一些无用的表达式,但不允许使用其他表达式。 (a)编译器最终会抛出诸如if (foo) assert(bar);
之类的警告,并且(b)这样的代码在发布时是合法的,但在调试时不合法,只是令人困惑:
assert(foo) // oops, forgot the semi-colon
foo.bar();
之类的东西最让人头疼的解析
,这就是为什么它被称为 “令人烦恼”。这是一个向后兼容的问题。如果C++现在改变了那些烦人的分析的含义,现有代码的含义就会改变。正如你指出的那样,现有的代码并不多,但C++委员会在向后兼容性方面采取了相当强硬的措施。如果您想要每五分钟更改一次的语言,请使用Perl ;-)
无论如何,现在已经太晚了。即使我们对C++ 0x委员会错过了一些很好的见解,为什么某些特性应该被删除或者不兼容地改变,除非FCD明确错误,否则它们不会破坏FCD中的任何内容。
请注意,对于您的所有建议,任何编译器都可能为它们发出警告(实际上,我不明白您的问题与第二个示例有什么关系,但对于无用的表达式和对函数体中令人厌烦的解析来说肯定是这样) 。如果你是对的,没有人故意这样做,警告不会造成任何伤害。如果你错误地认为没有人这么做,你所说的删除它们的情况是不正确的。流行编译器中的警告可能会为删除功能铺平道路,特别是因为标准主要由编译器编写者撰写。事实上,我们并不总是得到这些事情的警告,这对我来说意味着它比你想象的还要多。
除了如果编译器有两种方法可以解析语句,但其中一种是非法的,那么它知道它必须是另一种,这很简单,而如果标准允许这两种方式,那么编译器必须决定哪一个,哪一个简单得多。那里的可行性程序越不可靠,您需要决定哪些程序的逻辑就越少。 – Puppy 2010-11-10 12:43:10
虽然这并非总是如此,因为编译器需要检测某些无效表达式并报告适当的错误消息。在任何情况下,如你所暗示的,它肯定不能认为代码是有效的。 – 2010-11-10 16:02:36
+1表示智能(和有效)参数。 :-) – 2011-01-04 22:09:43