我开始了新的私人项目,并决定用更多的C++ 11/14这段时间.所以我也开始使用新的返回语法
auto functionName() -> returnType;
Run Code Online (Sandbox Code Playgroud)
它在大多数情况下工作得很好,但现在我需要一些错误处理,并且无法找到如何重写这样的东西:
virtual const char* what() const noexcept override;
Run Code Online (Sandbox Code Playgroud)
使用新语法.是否存在无法使用新语法的情况,或者我是否只是不够聪明才能找到正确的顺序?对我而言,保持一致是很重要的,所以我希望问题更多地在我身边.
小智 37
是的,这不是你通常猜的.
virtual auto what() const noexcept -> const char * override;
Run Code Online (Sandbox Code Playgroud)
这只是您必须使用的顺序.可能语法可能不同,但这就是我们所拥有的.
Pet*_*ter 37
问题的原因是它noexcept
是函数声明override
符的一部分(并且被认为是C++ 17中函数类型的一部分),而是一个(可选地使用的)标识符,它不是函数声明符的一部分.
因此,不使用override
声明即可
virtual auto what() const noexcept -> const char *;
Run Code Online (Sandbox Code Playgroud)
并且,由于override
必须在此声明之后出现,它将导致
virtual auto what() const noexcept -> const char * override;
Run Code Online (Sandbox Code Playgroud)
也就是说,选择那些最能反映您意图的功能,而不是盲目地使用C++ 11/C++ 14功能.没有一些规则只需要使用C++ 11/C++ 14功能,如果有更旧的替代方案来实现相同的功能.
Hol*_*Cat 21
新语法支持旧语法的所有功能.
virtual const char* what() const noexcept override;
Run Code Online (Sandbox Code Playgroud)
必须改写为
virtual auto what() const noexcept -> const char * override;
Run Code Online (Sandbox Code Playgroud)
实际上,新语法支持更多功能:
它允许您decltype
对函数参数执行操作.
template <typename A, typename B> auto plus(A a, B b) -> decltype(a+b)
{
return A + B;
}
Run Code Online (Sandbox Code Playgroud)它还允许您执行decltype
操作this
,这反过来允许您执行decltype
成员函数.看到这个.
struct S
{
int a() {return 1;}
auto b() -> decltype(a()) {return 2;} // Works.
decltype(a()) c() {return 2;} // ERROR.
};
Run Code Online (Sandbox Code Playgroud)但是虽然新语法具有所有这些附加功能,但它不应该是旧语法的替代品.至少这是我理解它的方式.
一些程序员喜欢使用它,但据我所知,Stack Overflow上的大多数程序员都喜欢在可能的情况下使用旧语法.
归档时间: |
|
查看次数: |
3418 次 |
最近记录: |