例如,前向声明和来自维基百科的替代函数语法部分:
Ret 类型是添加 Lhs 和 Rhs 类型将产生的任何内容。即使使用 [...] decltype,这也是不可能的:
template<class Lhs, class Rhs> decltype(lhs+rhs) //Not legal C++11 adding_func(const Lhs &lhs, const Rhs &rhs) { return lhs + rhs; }
这不是合法的 C++,因为 lhs 和 rhs 尚未定义;在解析器解析函数原型的其余部分之前,它们将不是有效的标识符。
当系统处于主要内存压力下时,这是可以理解的(它允许传递作为流操作完成)。但是,在这个时代(我的智能手机有足够的 RAM 来保存完整的源代码、完整的解析树,然后是一些用于任何合理文件的内存)为什么令牌的顺序很重要?语法中是否存在一些奇怪的极端情况,例如,decltype
除非您知道其中的标识符是类型还是变量,否则无法找到非终结生产的结尾?另外一点,为什么全局/命名空间范围声明的顺序很重要?
编辑,原来这是合法的:
class foo {};
foo Foober(int foo) { return ::foo(); }
如果我在野外遇到这种情况,它最终会出现在 The Daily WTF 上,但它仍然是合法的。