我见过人们使用以下语法来实现功能:
auto get_next() -> int
{
/// ...
}
代替:
int get_next()
{
/// ...
}
我都了解,而且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用。就我个人而言,我会避免使用其他代码的语法,因为在阅读代码时,我更喜欢首先阅读函数的具体返回类型,而不是最后。
如上所示,对非模板代码使用尾随返回类型语法有什么好处(个人偏好或风格除外)?
我见过人们使用以下语法来实现功能:
auto get_next() -> int
{
/// ...
}
代替:
int get_next()
{
/// ...
}
我都了解,而且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用。就我个人而言,我会避免使用其他代码的语法,因为在阅读代码时,我更喜欢首先阅读函数的具体返回类型,而不是最后。
如上所示,对非模板代码使用尾随返回类型语法有什么好处(个人偏好或风格除外)?
除了sergeyrar 的回答之外,我可以想象有人可能会喜欢非模板函数的尾随返回类型:
为 lambda 表达式和函数指定返回类型与语法相同。
当您从左到右阅读函数签名时,函数参数首先出现。这可能更有意义,因为任何函数都需要参数才能以返回值的形式产生任何结果。
指定返回类型时可以使用函数参数类型(反之不行):
auto f(int x) -> decltype(x)
{
return x + 42;
}
这在上面的示例中没有意义,但请考虑长迭代器类型名称。
一个潜在的好处是它使您声明的所有函数名称都对齐:
auto get_next(int x, int y) -> int;
auto divide(double x, double y) -> double;
auto printSomething() -> void;
auto generateSubstring(const std::string &s, int start, int len) -> std::string;
好吧,您已经提到了尾随返回类型的主要用例。如果返回类型取决于参数,则使用它。如果我们排除该用例,您可能获得的唯一优势是增强代码的可读性,特别是如果您的返回类型有点复杂,但在这种情况下使用尾随返回没有技术优势。