我没有看到在所有解析完成后让 decltype 执行类型解析的缺点(这对于上面的示例来说效果很好)。
缺点是,如果不从根本上改变 C++ 解析和处理模型的基本基础,这是不可能的。
为了执行您的建议,编译器必须查看decltype
语法并对语法内容做一些基本的词法分析。然后,它继续解析更多源文件。在稍后的某个时刻(什么时候?),它决定去,“嘿,我之前看过的那些东西?我现在要为它们做所有的解析工作。”
一般来说,C++ 不支持查找ahead用于符号的定义。 C++解析框架的基本假设是,如果符号在使用之前没有声明,则会出现编译错误。
类可以不受前瞻影响,但仅限于其成员。这部分是因为 id 表达式何时可以引用成员变量(即:如果它没有引用作用域中已声明的本地或全局变量),这一点非常清楚。这里的情况并非如此,我们不确定 id 表达式到底指的是什么。
此外,您的建议会产生歧义。这是什么意思:
int lhs;
template<class Lhs, class Rhs>
decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs);
decltype 语法是否引用全局lhs
变量,或者局部变量lhs
函数参数?
我们现在的做法是,两者之间有明确的界限:
int lhs;
float rhs;
template<class Lhs, class Rhs>
decltype(lhs+rhs) adding_func1(const Lhs &lhs, const Rhs &rhs);
template<class Lhs, class Rhs>
auto adding_func2(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs);
adding_func1
指的是全局变量。adding_func2
指的是函数参数。
所以你可以从根本上破坏地球上的每一个 C++ 编译器。或者您可以简单地稍后指定您的返回类型。
或者您可以采用 C++14 方法根本懒得去陈述 http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3638.html.