c++ - 尾随返回类型语法风格是否应该成为新 C++11 程序的默认设置?

标签 c++ c++11 auto trailing-return-type

<分区>

C++11 支持新的函数语法:

auto func_name(int x, int y) -> int;

目前这个函数将被声明为:

int func_name(int x, int y);

新风格似乎还没有被广泛采用(比如在 gcc STL 中)

但是,这种新风格应该在新的 C++11 程序中随处可见,还是只在需要时才使用?

就我个人而言,如果可能的话,我更喜欢旧的风格,但是混合风格的代码库看起来很难看。

最佳答案

在某些情况下,您必须使用尾随返回类型。最值得注意的是,如果指定了 lambda 返回类型,则必须通过尾随返回类型指定。此外,如果您的返回类型使用 decltype这要求参数名称在范围内,必须使用尾随返回类型(但是,通常可以使用 declval<T> 来解决后一个问题)。

尾随返回类型确实有一些其他的小优点。例如,考虑使用传统函数语法的非内联成员函数定义:

struct my_awesome_type
{
    typedef std::vector<int> integer_sequence;

    integer_sequence get_integers() const;
}; 

my_awesome_type::integer_sequence my_awesome_type::get_integers() const
{
    // ...
}

直到类名出现在 ::get_integers 之前,成员 typedef 才在范围内,所以我们必须重复两次类资格。如果我们使用尾随返回类型,我们不需要重复类型的名称:

auto my_awesome_type::get_integers() const -> integer_sequence
{
    // ...
}

在这个例子中,这没什么大不了的,但是如果你有很长的类名或者类模板的成员函数不是内联定义的,那么它会对可读性产生很大的影响。

在他的"Fresh Paint"在 C++Now 2012 的 session 上,Alisdair Meredith 指出,如果您始终使用尾随返回类型,那么所有函数的名称都会整齐排列:

auto foo() -> int;
auto bar() -> really_long_typedef_name;

我在 CxxReflect 中到处都使用了尾随返回类型,所以如果您正在寻找代码如何一致地使用它们的示例,您可以看看那里(例如,the type class)。

关于c++ - 尾随返回类型语法风格是否应该成为新 C++11 程序的默认设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13888357/

相关文章:

c++ - 哪个 Windows API 捕获屏幕比 Bitblt 或任何其他镜像驱动程序更快?

c++ - C++11 自动类型危险吗?

c++ - 模板类的工厂方法

c++ - 如何使模板函数成为另一个模板函数的参数?

c++ - 制作可变参数函数,它采用任意数量的 void 仿函数

c++ - std::function 是否比自动存储 lambda 函数重

azure - azure应用服务中最大连接和响应超时的自动缩放规则

c++ - 在 C++ 中表示概率

c++ - 如何从 std::function 获取基本函数类型?

c++ - Eclipse PTP OpenMPI 并行运行/调试