为什么在C++ 11中需要添加trailing-return-types?

Mar*_*sen 13 c++ compilation c++11 trailing-return-type

我终于开始阅读,我不明白为什么需要trailing-return-types.

我遇到了以下示例,用于突出显示问题:

template<class Lhs, class Rhs>
  decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs) {return lhs + rhs;} 
Run Code Online (Sandbox Code Playgroud)

这个例子是非法的,因为decltype(lhs+rhs)没有工作,因为标识符lhsrhs仅解析阶段后有效.

我想我的问题是关于decltype类型解析的时间.如果我没有弄错,关键字decltype用于在编译时确定表达式的类型.

decltype在完成所有解析之后,我没有看到执行类型解析的缺点(这对于上面的示例可以正常工作).我相信这将是解决问题的一种更简单的方法......

相反,C++ 11标准提供了trailing-return-types:

template<class Lhs, class Rhs>
  auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}
Run Code Online (Sandbox Code Playgroud)

我毫不怀疑我遗漏了一些东西,因为我没有看到其他使用trailing-return-types.我的推理中的缺陷在哪里?

trailing-return-types对我来说似乎是一个过于复杂的解决方案,因为decltype在解析完整的函数体之后具有类型解析也可以正常工作?

Nic*_*las 18

在完成所有解析之后,我没有看到让decltype执行类型解析的缺点(这对于上面的示例可以正常工作).

缺点是,如果不从根本上改变C++解析和处理模型的基本基础,那是不可能的.

为了做你的建议,编译器必须查看decltype语法并对语法内容进行一些基本的词法分析.然后,它继续解析更多的源文件.在某个晚些时候(什么时候?),它决定去,"嘿,我以前看过的那些东西?我现在要为他们做所有的解析工作."

作为一般规则,C++不支持寻找未来的符号的定义.C++解析框架的基本假设是,如果在使用之前未声明符号,则它是编译器错误.

课程可以超越前瞻,但仅限于其成员.这部分是因为当id-expression可以引用成员变量时它非常清楚(即:如果它不是指范围内已声明的局部变量或全局变量).这不是这里的情况,我们不确定id-expression究竟是指什么.

此外,你的建议会产生歧义.这是什么意思:

int lhs;

template<class Lhs, class Rhs>
  decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

adding_func1指全局变量.adding_func2是指函数参数.

因此,您可以从根本上打破地球上的每个C++编译器.或者您可以简单地延迟指定您的退货类型.

或者你可以采用C++ 14方法而不用费心去说明它.