【问题标题】:Alternative function syntax difference替代函数语法差异
【发布时间】:2012-12-14 19:00:22
【问题描述】:

这两个函数有什么区别?

auto func(int a, int b) -> int;

int func(int a, int b);

【问题讨论】:

    标签: c++ c++11 declaration function-declaration


    【解决方案1】:

    除了符号之外,上述情况没有任何区别。当您想要引用一个或多个参数来确定函数的返回类型时,替代函数声明语法变得很重要。例如:

    template <typename S, typename T>
    auto multiply(S const& s, T const& t) -> decltype(s * t);
    

    (是的,这是一个愚蠢的例子)

    【讨论】:

    • 我一直不明白为什么编译器不能用旧语法处理同样的问题,比如:template &lt;typename S, typename T&gt; decltype(s * t) multiply(S const&amp; s, T const&amp; t);你知道为什么吗?
    • @leemes:编译器可能会使用旧式语法做同样的事情,但 C++ 始终遵循在声明之前没有名称可见的规则。这条规则是否是一个好的规则是一个单独的问题,但一致性会有所帮助。
    • @billz:当然,lambda 规则和尾随返回在某种程度上是齐头并进的:如果函数没有尾随返回,那么 lambda 也会使用不同的东西。我似乎记得这两种符号几乎是一起开发的。
    • @leemes:是的,这是正确的,但它不违反规则:在类定义中定义的成员函数被视为在类定义之外定义,紧跟在类定义之后.类中的成员定义只是一个简写形式(尽管我不太确定它如何与类模板中的 friend 函数一起使用,因为这些不能在类定义之外定义)。
    • +1:也许是愚蠢的例子,但还是一个非常精确的例子。
    【解决方案2】:

    这两个声明之间没有有用的区别;两个函数都返回一个int

    C++11 的尾随返回类型对于带有 template 参数的函数很有用,其中返回类型在编译时才知道,例如在这个问题中:How do I properly write trailing return type?

    【讨论】:

      【解决方案3】:

      它们使用不同的语法,并且只有一种在 C++11 之前的 C++ 版本中有效。除此之外,您在问题中显示的两个函数声明之间没有区别。

      【讨论】:

        猜你喜欢
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多