新的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;