【发布时间】:2016-11-27 05:24:58
【问题描述】:
我开始了一个新的私人项目,并决定这次使用更多C++11/14。所以我也开始使用新的返回语法
auto functionName() -> returnType;
它在大多数情况下工作得很好,但现在我需要一些错误处理并且不知道如何重写这样的东西:
virtual const char* what() const noexcept override;
使用新语法。是否存在无法使用新语法的情况,或者我只是不够聪明,无法找到正确的顺序?对我来说,保持一致很重要,所以我希望问题更多地出现在我这边。
【问题讨论】:
-
对于 noexcept 见这里:stackoverflow.com/questions/16598320/…
-
新的返回类型实际上是一种允许在函数参数上使用 decltype() 的技巧。由于函数参数只能在声明它们之后在 decltype 中使用,因此不能将这样的构造放置在返回类型的“旧”位置 - 所以他们移动了返回类型。在我看来,这对编译器编写者的帮助太大了,但代价是整个语言对其他人的可用性降低了。无论如何,您没有意识形态上的理由将整个项目转换为“新”语法;它本身并不更好或更现代。
-
我不知道有什么理由在非泛型代码中使用尾随返回类型语法,除非您认为它看起来更好。有一些 C++11 特性,如
auto或大括号初始化,可以说是为了在所有“现代”代码中“默认”使用,但我很确定尾随返回类型只存在于支持某个子集以前无法编写的类型安全通用代码。 -
@lxrec:我确实发现它在以下情况下很有用:假设我想声明某个类的成员函数并在编译时将它们注册到某个地方。为了避免大量的样板,我可能会使用宏。然而,如果一个宏开始一个函数声明,它还必须包括返回类型,因为它出现在函数名之后。如果您使用尾随返回类型语法,则可以缓解这种情况。宏可以对
&my_type::NAME执行某些操作,然后还声明auto NAME并让用户指定签名,如果他们愿意,还可以指定定义。 -
@KerrekSB OP 从未声称,甚至明确表示(请参阅 11 和 14 后面的链接)这个问题适用于两者。请不要再吹毛求疵了吗?