我开始了一个新的私有项目,并决定此次使用更多C++11 / 14。所以我也开始使用新的返回语法
auto functionName() -> returnType;
它在很大程度上非常有效,但现在我需要一些错误处理,并且无法找到如何重写这样的东西:
virtual const char* what() const noexcept override;
使用新语法。是否存在无法使用新语法的情况,或者我是否只是不够聪明才能找到正确的顺序?对我来说,保持一致是很重要的,所以我希望问题更多地在我身边。
答案 0 :(得分:37)
是的,这不是你通常会猜到的。
@foreach (var i in Model.Select(i=>i.InspekcijskoTijelo).Distinct()) {
<option value="@i.InspekcijskoTijeloId">@i.NazivInspekcijskogTijela</option>
}
这只是您必须使用的顺序。可能,语法可能有所不同,但这就是我们所拥有的。
答案 1 :(得分:37)
问题的原因是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功能,如果有更旧的替代方案可以实现相同的功能。
答案 2 :(得分:21)
新语法支持旧语法的所有功能。
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
。 See this.
struct S
{
int a() {return 1;}
auto b() -> decltype(a()) {return 2;} // Works.
decltype(a()) c() {return 2;} // ERROR.
};
虽然新语法具有所有这些附加功能,但它不应该是旧语法的替代品。至少这是我理解它的方式。
有些程序员喜欢使用它,但据我所知,Stack Overflow上的大多数程序员都喜欢在可能的情况下使用旧的语法。
答案 3 :(得分:1)
由于您也询问了C ++ 14,对于您的场景,这比后缀返回类型语法更好;
virtual auto what() const noexcept override;