随着 GCC 4.8.0的发布,我们有了一个支持自动返回类型演绎的编译器,这是 C + + 14的一部分。有了 -std=c++1y
,我可以这样做:
auto foo() { //deduced to be int
return 5;
}
我的问题是: 什么时候我应该使用这个特性? 什么时候它是必要的,什么时候它使代码更干净?
我能想到的第一种情况是,只要有可能。用这种方式编写的每个函数都应该是。这样做的问题是,它可能并不总是使代码更具可读性。
下一个场景是避免更复杂的返回类型:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
我认为这不会真的成为一个问题,尽管我猜在某些情况下返回类型明确地依赖于参数可能会更清楚。
其次,为了防止冗余:
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};
来代替向量,但这并不总是有效,我们需要在函数头和函数体中指定类型。这纯粹是多余的,而且自动返回类型推断使我们避免了这种多余。
最后,它可以用来代替非常简单的功能:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
但是,有时候我们可能会查看函数,希望知道确切的类型,如果没有提供该类型,我们就必须转到代码中的另一个点,比如声明 pos_
的位置。
随着这些场景的展开,哪一个场景实际上证明了这个特性在使代码更清晰方面是有用的?那么我在这里没有提到的情景呢?在使用这个特性之前,我应该采取什么预防措施,以免它以后伤害到我?这个特性有没有带来什么新的东西,没有它就不可能实现?
请注意,这些多重问题是为了帮助寻找可以回答这个问题的视角。