[英]Is the new C++ return syntax limited?
是的,这不是你通常猜的。
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; }
它还允许你做decltype
在this
,这反过来又可以让你做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.