【问题标题】:Trailing return type in non-template functions [duplicate]非模板函数中的尾随返回类型
【发布时间】:2020-09-28 08:19:32
【问题描述】:

我见过有人使用以下语法来实现函数:

auto get_next() -> int 
{
   /// ...
}

代替:

int get_next()
{
   /// ...
}

我都了解,而且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用。就我个人而言,我会避免使用其他代码的语法,因为在阅读代码时,我更喜欢先阅读函数的具体返回类型,而不是最后。

如上所示对非模板代码使用尾随返回类型语法有什么好处(个人偏好或风格除外)?

【问题讨论】:

  • 没有任何用例的 Yeag 尾随返回类型对 IMO 毫无意义。
  • 除了风格没有优势。阅读有关 AAA 的信息,有些人会尽可能地遵循它。一旦您决定采用一种风格,因为它在某些情况下具有优势,那么在所有情况下都应用它是有意义的。其他人(包括我)希望在需要它的情况下从其余代码中脱颖而出,那么使用它总是不利的。这里纯粹是风格问题

标签: c++ c++11 trailing-return-type


【解决方案1】:

除了sergeyrar's answer,我可以想象有人可能会喜欢非模板函数的尾随返回类型:

  1. 为 lambda 表达式和函数指定返回类型与 w.r.t 相同。语法。

  2. 当您从左到右阅读函数签名时,函数参数首先出现。这可能更有意义,因为任何函数都需要参数才能以返回值的形式产生任何结果。

  3. 指定返回类型时可以使用函数参数类型(反之不行):

    auto f(int x) -> decltype(x)
    {
        return x + 42;
    }
    

    这在上面的示例中没有意义,但请考虑长迭代器类型名称。

【讨论】:

    【解决方案2】:

    一个潜在的好处是它可以让你声明的所有函数名对齐:

    auto get_next(int x, int y) -> int;
    auto divide(double x, double y) -> double;
    auto printSomething() -> void;
    auto generateSubstring(const std::string &s, int start, int len) -> std::string;
    

    来源:https://www.learncpp.com/cpp-tutorial/the-auto-keyword/

    【讨论】:

    • IMO 看起来很糟糕。
    【解决方案3】:

    您已经提到了尾随返回类型的主要用例。如果返回类型取决于参数,则使用它。 如果我们排除该用例,您可能获得的唯一优势是增强代码的可读性,特别是如果您的返回类型有点复杂,但在这种情况下使用尾随返回没有技术优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 2011-04-14
      • 2015-09-10
      • 2012-06-21
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多