声明函数有两种不同的风格,每种风格都采用不同的方法来指定返回类型。第一个遵循传统语法:
bool getMode() const;
另一方面,第二个利用 auto 关键字和返回类型的箭头语法:
auto getMode() const -> bool;
我的主要问题是是否有任何实质性理由选择一种风格而不是另一种风格。我知道可读性通常是主观的,但是是否有任何特定场景、最佳实践或性能考虑因素可以指导在这两种样式之间进行选择?
两者之间存在一个语义差异,当在类外部实现类方法时会出现这种差异。假设我们有一个定义了
typedef
和实例方法的类。
class Example {
using my_type_t = int;
my_type_t foobar();
};
现在我们进入
.cpp
文件来实现这个方法。如果我们使用尾随返回类型语法,那么一切都会正常。
auto Example::foobar() -> my_type_t {
...
}
但是,如果我们把类型放在前面,那么我们就必须在它前面加上前缀
Example::
Example::my_type_t Example::foobar() {
...
}
这仅仅是因为编译器的解析顺序。编译器只有在看到
Example
时才会“发现”我们位于类 Example::foobar
的内部。如果返回类型是尾随的,那么它出现在方法的限定名称之后,因此我们知道范围。如果返回类型出现在我们看到该名称之前,则返回类型将在周围范围内求值,并且必须是完全限定的。
对于模板类来说,这会变得更加混乱。比较
// Trailing syntax
template <typename T>
auto Example<T>::foobar() -> my_type_t {
...
}
// Prefix syntax
template <typename T>
typename Example<T>::my_type_t Example<T>::foobar() {
...
}