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

cpo*_*pow 36 c++ return c++11

我开始了新的私人项目,并决定用更多的C++ 11/14这段时间.所以我也开始使用新的返回语法

auto functionName() -> returnType;
Run Code Online (Sandbox Code Playgroud)

它在大多数情况下工作得很好,但现在我需要一些错误处理,并且无法找到如何重写这样的东西:

virtual const char* what() const noexcept override;
Run Code Online (Sandbox Code Playgroud)

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

小智 37

是的,这不是你通常猜的.

virtual auto what() const noexcept -> const char * override;
Run Code Online (Sandbox Code Playgroud)

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

  • 啊.为什么有人认为这是优越的?它当然不具有可读性.这种表示法只应在有限的情况下使用,例如在真正需要的模板中. (13认同)
  • @CodyGray没有人会说这里的新语法更清晰.我建议不要在这种情况下使用它.它是为通用代码引入的,您需要在范围内具有类型函数参数以形成返回类型.这不是一个美学原因.啊,对于lambdas,当然...... (6认同)

Pet*_*ter 37

问题的原因是它noexcept是函数声明override符的一部分(并且被认为是C++ 17中函数类型的一部分),而是一个(可选地使用的)标识符,它不是函数声明符的一部分.

因此,不使用override声明即可

virtual auto what() const noexcept -> const char *;
Run Code Online (Sandbox Code Playgroud)

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

virtual auto what() const noexcept -> const char * override;
Run Code Online (Sandbox Code Playgroud)

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


Hol*_*Cat 21

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

virtual const char* what() const noexcept override;
Run Code Online (Sandbox Code Playgroud)

必须改写为

virtual auto what() const noexcept -> const char * override;
Run Code Online (Sandbox Code Playgroud)

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


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

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

  • 特别是尾随返回类型允许您使用类中定义的类型,在返回类型中不合格. (6认同)