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

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

auto functionName() -> returnType; 

它大部分工作得很好,但现在我需要一些error handling,并不知道如何重新写这样的东西:

 virtual const char* what() const noexcept override; 

用新的语法。 是否有一些情况下,新的语法不能使用,或者我只是不够聪明,find正确的顺序? 对我来说,保持一致是很重要的,所以我希望这个问题在我这边。

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

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

这只是你必须使用的顺序。 语法本来可能不一样,但这是我们得到的。

问题的原因是noexcept是函数声明noexcept的一部分(并且被提议成为C ++ 17函数types的一部分),而override是一个(可选的)标识符,它不是函数声明符的一部分。

因此,没有使用override声明将是

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

而且,因为override必须出现在这个声明之后,所以会导致

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

这就是说,不要乱用C ++ 11 / C ++ 14的特性,select最能反映你意图的特性。 没有一些规则只需要使用C ++ 11 / C ++ 14function就可以实现相同的function。

新的语法支持旧的语法。

 virtual const char* what() const noexcept override; 

必须重写为

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

实际上,新的语法支持更多的function:

  • 它允许你在函数参数上执行decltype

     template <typename A, typename B> auto plus(A a, B b) -> decltype(a+b) { return A + B; } 
  • 它也允许你在this上执行decltype ,这又可以让你在成员函数上执行decltype 。 看到这个

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

但是,虽然新的语法具有所有这些附加function, 但它不应该替代旧function。 至less这是我的理解。

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

既然你也查询过C ++ 14,对于你的场景来说,这比后缀返回types的语法要好。

 virtual auto what() const noexcept override;