c ++ auto - 方便和混乱

时间:2014-09-04 16:41:08

标签: c++ c++11

我开始接受c ++ 11,此时我对“汽车”充满了爱恨。

毫无疑问,这很方便。

但它也令人困惑,这是一个代码:

auto w = foo->get_w();
auto i = w->get_i();
bar(i);

在此代码中,get_w()函数返回“struct S *”,这是w的类型。但是struct S有2个重载的get_i():

const I* get_i() const;
unique_ptr<I>& get_i();

因为w不是const,所以它被调用了第二个get_i(),因此bar(i)应该是bar(move(i))因为bar()签名是void bar(unique_ptr<I>) }。

但实际上,很容易失去踪迹。

这很好,这是在编译时捕获的,但是,我猜,我最初的热情正在减弱。

您怎么看?有提示吗?

2 个答案:

答案 0 :(得分:4)

对于这个问题,我必须链接Herb Sutter的这篇优秀文章:GotW #94 Solution: AAA Style (Almost Always Auto)

您可以从标题中阅读他的意见。他还提出了这个指导原则,其中的理由在文章中解释:

  

指南:请记住,偏好auto变量的主要原因是正确性,性能,可维护性和稳健性 - 最后只是打字方便。

他称赞的auto的主要方面是它避免了不必要的隐式转换,其中C ++中有很多并且它使得调用者更少依赖于函数接口,因为返回类型的更改会自动反映出来在局部变量的类型中。 auto在模板代码中也非常有用,因为您无需访问例如Container::value_type

答案 1 :(得分:2)

这取决于。无论什么时候比混淆更方便,然后使用它,否则不要。 对于一长串论点和意见,我将引用另一个不同的问题:Use of var keyword in C#