繁体   English   中英

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

[英]Is the new C++ return syntax limited?

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

auto functionName() -> returnType;

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

virtual const char* what() const noexcept override;

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

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

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

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

问题的原因是noexcept是函数声明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功能,如果有更旧的替代方案来实现相同的功能。

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

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; } 
  • 它还允许你做decltypethis ,这反过来又可以让你做decltype的成员函数。 看到这个。

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

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

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

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

virtual auto what() const noexcept override;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM