C++ 其中,C+;中实际需要尾部返回类型+;?
我正在阅读关于尾随返回类型的文章。我偶然发现了这个网站,它解释了这些退货类型的需求,并在下面提到C++ 其中,C+;中实际需要尾部返回类型+;?,c++,c++11,C++,C++11,我正在阅读关于尾随返回类型的文章。我偶然发现了这个网站,它解释了这些退货类型的需求,并在下面提到 模板 decltype(左侧+右侧)添加(常量左侧和左侧,常量右侧和右侧){ //错误:^^^“lhs”和“rhs”未在此作用域中声明 返回左侧+右侧; } 。。。因为编译器从左到右解析源代码,所以它会在lhs和rhs的定义之前看到它们,并拒绝代码。通过使用尾部返回类型,我们可以绕过这个限制 但根据我的理解,当编译器达到decltype(lhs+rhs)时,它应该已经知道lhs和rhs的类型。任何
模板
decltype(左侧+右侧)添加(常量左侧和左侧,常量右侧和右侧){
//错误:^^^“lhs”和“rhs”未在此作用域中声明
返回左侧+右侧;
}
。。。因为编译器从左到右解析源代码,所以它会在lhs和rhs的定义之前看到它们,并拒绝代码。通过使用尾部返回类型,我们可以绕过这个限制
但根据我的理解,当编译器达到decltype(lhs+rhs)时,它应该已经知道lhs和rhs的类型。任何人都可以告诉我为什么编译器不能推断函数的返回类型,以及除了模板之外我们还必须使用尾随返回类型的其他用途。它知道大写类型
Lhs
和Rhs
,但不知道小写变量Lhs
和Rhs
。它们是在decltype
“根据我的理解,…”之后声明的。你能澄清一下为什么你认为编译器应该知道这些类型吗?编译器应该在到达decltype()时看到模板。除非我误解了你的问题;答案似乎在引用的文本中?“由于编译器从左到右解析源代码,它会在lhs和rhs的定义之前看到它们,并拒绝这些代码。”请注意,这些类型以大写字母开头,变量名以小写字母开头。@kadina编译器知道模板中的类型
,但是它不知道decltype
中提到的变量,因为它们还没有被声明。因此它不知道操作符+
中涉及的类型。也许Lhs
实现的operator+
与Rhs
不同,编译器直到看到声明才知道实际涉及哪些类型。
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;
}