c++ - 为什么 C++11 仍然强制可见性的词法排序

标签 c++ c++11 language-design

例如,前向声明和来自 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/

相关文章:

c++ - Qt 与 STL 和 Boost 配合得好吗?

c++ - 破坏 Glib::RefPtr 会导致 GTK 3 核心中的断言失败

c++ - 将字符串和枚举映射到模板化类型

go - if 作为表达式和 if 作为语句之间的区别

lua - Lua 主要基于成熟的编程语言思想吗?

C++:有条件地将键和值插入 std::map

c++ - 从 C++Builder 到 Visual Studio 2008

c++ - 如何在给定宽度和高度的情况下调整对象的二维 vector 的大小?

c++ - 我什么时候应该使用 std::thread::detach?

Lua操作符,为什么没有定义+=、-=等?