【发布时间】:2020-05-31 23:43:28
【问题描述】:
我正在阅读有关尾随返回类型的信息。我遇到了这个网站https://blog.petrzemek.net/2017/01/17/pros-and-cons-of-alternative-function-syntax-in-cpp/,它解释了这些返回类型的需求,它提到如下。
template<typename Lhs, typename Rhs> decltype(lhs + rhs) add(const Lhs& lhs, const Rhs& rhs) { // error: ^^^ 'lhs' and 'rhs' were not declared in this scope return lhs + rhs; }... 由于编译器从左到右解析源代码,它在定义之前看到 lhs 和 rhs,并拒绝代码。通过使用尾随返回类型,我们可以绕过这个限制。
但据我了解,当编译器到达 decltype(lhs + rhs) 时,它应该已经知道 lhs 和 rhs 的类型。谁能告诉我为什么编译器无法推断出函数的返回类型,还有其他用途我们必须使用模板以外的尾随返回类型。
【问题讨论】:
-
“根据我的理解,...”你能解释一下为什么你认为编译器应该知道类型吗?
-
编译器在到达 decltype() 时应该会看到模板
。 -
除非我误解了你的问题;似乎答案在引用的文本中? “由于编译器从左到右解析源代码,它会在定义之前看到 lhs 和 rhs,并拒绝代码。”注意这里的类型以大写字母开头,变量名以小写字母开头。
-
@kadina 编译器知道
template中的类型,但它不知道decltype中提到的变量 ,因为它们还没有被宣布。所以它不知道operator+中涉及的类型。也许Lhs实现operator+与Rhs不同,编译器直到看到声明才能知道实际涉及哪些类型。