我应该什么时候使用C 14自动返回类型扣除?

使用GCC 4.8.0发布,我们有一个支持自动返回类型推导的编译器,C 14的一部分。使用-std = c 1y,我可以这样做:

auto foo() { //deduced to be int
    return 5;
}

我的问题是:我应该在什么时候使用此功能?什么时候需要,什么时候使代码更清洁?

情况1

我可以想到的第一个场景是可能的。可以这样写的每个函数应该是。这个问题是,它可能不会使代码更可读。

情况2

下一种情况是避免更复杂的返回类型。作为一个很轻的例子:

template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
    return t + u;
}

我不相信会真的是一个问题,虽然我想有返回类型显式依赖的参数可能在一些情况下更清晰。

情况3

接下来,为了防止冗余:

auto foo() {
    std::vector<std::map<std::pair<int, double>, int>> ret;
    //fill ret in with stuff
    return ret;
}

在C 11中,我们有时可以返回{5,6,7};代替向量,但并不总是能解决,我们需要在函数头和函数体中指定类型。这是纯粹的冗余,自动返回类型的扣除使我们免于冗余。

情况4

最后,它可以用来代替非常简单的功能:

auto position() {
    return pos_;
}

auto area() {
    return length_ * width_;
}

有时候,我们可能会查看函数,想知道确切的类型,如果没有提供,我们必须去代码中的另一个点,如pos_被声明。

结论

有了这些场景,哪些实际上证明是一种情况,这个功能是有用的使代码更清洁?我在这里忽略了什么情况?在使用此功能之前,我应该采取什么预防措施,以便它以后不咬我?有什么新的功能带给这个表是不可能没有它吗?

注意,多个问题意味着帮助找到从中回答这个问题的观点。

C 11引发了类似的问题:何时在lambda中使用返回类型推导,以及何时使用自动变量。

C和C 03中的问题的传统答案是“跨语句边界我们使类型显式,在表达式中他们通常是隐含的,但我们可以使他们显式使用casts”。 C 11和C 1y引入类型扣除工具,以便可以在新的地方放弃类型。

对不起,但你不会通过做一般规则解决这个问题。你需要看看特定的代码,并自己决定是否它有助于可读性指定类型的所有地方:是更好的你的代码说,“这个东西的类型是X”,或者它是更好的你的代码说,“这个东西的类型与理解这部分代码无关:编译器需要知道,我们可能可以工作,但我们不需要在这里说”。

由于“可读性”没有被客观地定义[*],并且由于阅读器的不同而不同,因此作为一段代码的作者/编辑者,不能完全满足一个样式指南。即使在风格指南确实指定规范的情况下,不同的人也会喜欢不同的规范,并且会倾向于发现“不太可读”的不熟悉的东西。因此,特定提议的风格规则的可读性通常只能在其他风格规则的上下文中被判断。

所有的场景(即使是第一个)都会用于某人的编码风格。我个人认为第二个是最引人注目的用例,但即使如此,我预计它将取决于您的文档工具。看到文档的函数模板的返回类型是auto,而看到它被记录为decltype(t u)创建一个已发布的接口,你可以(希望)依赖。

[*]偶尔有人试图做一些客观的测量。在很小程度上,任何人提出任何具有统计意义和普遍适用的结果,他们完全被工作程序员忽略,赞成作者的本能“什么是”可读的。

http://stackoverflow.com/questions/15737223/when-should-i-use-c14-automatic-return-type-deduction

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:我应该什么时候使用C 14自动返回类型扣除?