代码之家  ›  专栏  ›  技术社区  ›  jcoder

函数返回类型样式

  •  12
  • jcoder  · 技术社区  · 15 年前

    我在学习 c++0x ,至少由Visual C++支持的部分表示2010 beta。 这是一个关于风格的问题,而不是它是如何运作的。也许时尚和良好实践对于一个还没有发布的标准来说还为时过早……

    C++0X 您可以在函数末尾使用->类型来定义方法的返回类型,而不是将类型放在开头。我相信由于lambdas和一些新的 decltype 关键字,但据我所知,你可以在任何地方使用它。

    // Old style 
    int add1(int a, int b)
    {
     return a + b;
    }
    
    // New style return type
    auto add2(int a, int b) -> int
    {
     return a + b;
    }
    

    我的问题是,有些函数需要用新的方式定义,为了保持一致性,用这种方式定义所有函数被认为是一种好的方式吗?还是应该坚持只在必要时使用?

    7 回复  |  直到 15 年前
        1
  •  18
  •   gimpf    15 年前

    不要仅仅为了保持一致而保持风格一致。代码应该是可读的,也就是可以理解的,这是唯一真正的度量标准。在95%的方法中加入杂波以与其他5%的方法保持一致,好吧,这听起来不对。

        2
  •  5
  •   David Rodríguez - dribeas    15 年前

    有一个巨大的代码库使用“旧的/当前的”规则。我敢打赌这会持续很长一段时间。一致性的问题有两个方面:你将与谁保持一致,少数需要新语法或所有现有代码的代码?

    当一点也不需要新的语法时,我会继续使用旧的语法,但是之后,只有时间会告诉我们什么是常用的语法。

    还要注意,新语法仍然有点奇怪:您将返回类型声明为 auto 然后定义 汽车 意思是在签名声明的最后…它感觉不自然(即使你不把它与你自己的经验相比较)

        3
  •  5
  •   CB Bailey    15 年前

    就我个人而言,必要时我会用它。就像 this-> 只有在访问基类模板的成员(或者在其他情况下隐藏)时才需要,因此 auto fn() -> type 仅当在函数签名的其余部分可见之前无法确定返回类型时才需要。

    使用这个经验法则可能会帮助大多数代码读者,他们可能会想“为什么作者认为我们需要这样编写声明?”否则。

        4
  •  5
  •   visitor    15 年前

    我认为没有必要把它用于常规功能。它有特殊的用途,可以让你轻松地做以前可能很尴尬的事情。例如:

    template <class Container, class T>
    auto find(Container& c, const T& t) -> decltype(c.begin());
    

    这里我们不知道container是否为const,因此返回类型是否为 Container::iterator Container::const_iterator (可以根据 begin() 会回来的)。

        5
  •  2
  •   Reto Meier    15 年前

    在我看来,这将改变一个C++(和其他C类)程序员的一生的习惯。

    如果你对每个函数都使用这种风格,那么你可能是唯一一个这样做的人:-)

        6
  •  2
  •   GrayWizardx    15 年前

    我想目前的标准将会胜出,因为到目前为止,它已经提出了对定义的每一个修改。当然,它已经被扩展了,但是C++的基本语义是如此细粒度以至于我认为它们不值得更改。他们影响了很多语言,风格引导着它的荒谬。

    至于您的问题,我将尝试将代码分成几个模块,以明确您使用的是旧样式还是新样式。在这两种混合的地方,我会尽可能确定和描绘它。把他们聚在一起等。

    [个人观点]我发现在文件中浏览和观察样式的前后变化,或者彻底改变,真的很刺耳。这让我想知道还有什么隐藏在里面。

        7
  •  1
  •   AProgrammer    15 年前

    好的风格变化——如果你不相信我,看看98年什么是好的风格,现在是什么——很难知道什么是好的风格,为什么。IMHO,目前所有与C++0X相关的都是实验性的,合格的或不好的风格只是不适用。