我开始接受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>)
}。
但实际上,很容易失去踪迹。
这很好,这是在编译时捕获的,但是,我猜,我最初的热情正在减弱。
您怎么看?有提示吗?
答案 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#