例如,前向声明和来自 Wikipedia section on Alternative function syntax 的声明:
The type Ret is whatever the addition of types Lhs and Rhs will produce. Even with [...] decltype, this is not possible:
template<class Lhs, class Rhs> decltype(lhs+rhs) //Not legal C++11 adding_func(const Lhs &lhs, const Rhs &rhs) { return lhs + rhs; }
This is not legal C++ because lhs and rhs have not yet been defined; they will not be valid identifiers until after the parser has parsed the rest of the function prototype.
当系统处于主要内存压力下时,这是可以理解的(它允许传递作为流操作完成)。但是为什么在这个时代(我的智能手机有足够的 RAM 来保存完整的源代码、完整的解析树,然后还有一些用于任何合理的文件) token 的顺序重要吗?语法中是否存在一些奇怪的极端情况,例如,除非您知道其中的标识符是类型还是变量,否则无法找到 decltype
非终端产生式的结尾?另一方面,为什么全局/ namespace 范围声明的顺序很重要?
编辑,原来这是合法的:
class foo {};
foo Foober(int foo) { return ::foo(); }
如果我在野外遇到这个,它最终会出现在 The Daily WTF 上,但它仍然是合法的。
最佳答案
这不是容量问题,而是向后兼容性问题。
新版本的语言必须保留几乎所有旧功能以保持向后兼容性。在最初的 C++ 中,成员函数返回类型不会在类或函数的范围内查找。它是在函数声明的封闭范围内查找的。更改此规则对于向后兼容性可能是灾难性的。
解决它的唯一方法是专门为 decltype
参数创建一个异常(exception)。但这会非常不一致并且容易出错。
关于c++ - 为什么 C++11 仍然强制可见性的词法排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14388410/