【问题标题】:Where trailing return type is actually needed in C++?C++ 中实际需要尾随返回类型的地方?
【发布时间】: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 不同,编译器直到看到声明才能知道实际涉及哪些类型。

标签: c++ c++11


【解决方案1】:

它知道大写类型LhsRhs,但不知道小写变量lhsrhs。它们是在decltype 之后声明的。

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多