随着 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 中,我们有时可以只return {5, 6, 7};
代替向量,但这并不总是有效,我们需要在函数头和函数体中指定类型。这纯粹是多余的,而自动返回类型扣除使我们免于这种冗余。
方案 4
最后,它可以用来代替非常简单的函数:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
但是,有时我们可能会查看函数,想知道确切的类型,如果那里没有提供它,我们必须转到代码中的另一个点,比如pos_
声明的位置。
结论
列出了这些场景,其中哪些实际上被证明是该功能有助于使代码更清晰的情况?我在这里没有提到的场景呢?在使用此功能之前我应该采取哪些预防措施,以免它以后咬我?如果没有它,这个功能有什么新东西是不可能的吗?
请注意,多个问题旨在帮助找到回答这个问题的观点。