Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 其中,C+;中实际需要尾部返回类型+;?_C++_C++11 - Fatal编程技术网

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;
}