新的C ++返回语法是否有限?

时间:2016-07-23 11:17:17

标签: c++ c++11 return

我开始了一个新的私有项目,并决定此次使用更多C++11 / 14。所以我也开始使用新的返回语法

auto functionName() -> returnType;

它在很大程度上非常有效,但现在我需要一些错误处理,并且无法找到如何重写这样的东西:

virtual const char* what() const noexcept override;

使用新语法。是否存在无法使用新语法的情况,或者我是否只是不够聪明才能找到正确的顺序?对我来说,保持一致是很重要的,所以我希望问题更多地在我身边。

4 个答案:

答案 0 :(得分:37)

是的,这不是你通常会猜到的。

@foreach (var i in Model.Select(i=>i.InspekcijskoTijelo).Distinct()) {
    <option value="@i.InspekcijskoTijeloId">@i.NazivInspekcijskogTijela</option>
}

这只是您必须使用的顺序。可能,语法可能有所不同,但这就是我们所拥有的。

答案 1 :(得分:37)

问题的原因是noexcept是函数声明符的一部分(并且建议成为C ++ 17中函数类型的一部分),而override是(可选)不属于函数声明符的标识符。

因此,如果不使用override,声明将是

virtual auto what() const noexcept -> const char *;

并且,由于override必须在此声明之后出现,因此将导致

virtual auto what() const noexcept -> const char * override;

那就是说,而不是盲目地使用C ++ 11 / C ++ 14的功能,选择那些最能反映你意图的功能。没有一些规则只需要使用C ++ 11 / C ++ 14功能,如果有更旧的替代方案可以实现相同的功能。

答案 2 :(得分:21)

新语法支持旧语法的所有功能。

virtual const char* what() const noexcept override;

必须改写为

virtual auto what() const noexcept -> const char * override;

实际上,新语法支持更多功能:

  • 它允许您对函数参数执行decltype

    template <typename A, typename B> auto plus(A a, B b) -> decltype(a+b)
    {
        return A + B;
    }
    
  • 它还允许您在decltype上执行this,这样您就可以对成员函数执行decltypeSee this.

    struct S
    {
        int a() {return 1;}
        auto b() -> decltype(a()) {return 2;} // Works.
        decltype(a()) c() {return 2;} // ERROR.
    };
    

虽然新语法具有所有这些附加功能,但它不应该是旧语法的替代品。至少这是我理解它的方式。

有些程序员喜欢使用它,但据我所知,Stack Overflow上的大多数程序员都喜欢在可能的情况下使用旧的语法。

答案 3 :(得分:1)

由于您也询问了C ++ 14,对于您的场景,这比后缀返回类型语法更好;

virtual auto what() const noexcept override;