2014-09-04 94 views
3

我开始捡起C++ 11,在这一点上我有一个“自动”的爱恨。C++ auto - 方便和混淆

毫无疑问,这很方便。

但它也是混乱的,这里是一个代码:

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

在这段代码,get_w()函数返回“结构S *”,这是W公司的类型。但结构S有2个重载get_i():

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

由于w是不是const,所以这是第二get_i()被调用,从而bar(i)应该是bar(move(i))因为巴()签名是void bar(unique_ptr<I>)

但实际上,很容易迷路。

这很好,这是在编译时遇到的,但是,我想,我最初的热情正在减退。

您觉得如何?任何提示?

+0

'bar'的原型是什么? – 2014-09-04 16:46:39

+7

我认为这里的问题是令人困惑的const重载。这两种类型完全无关。你可能想和struct'S'的作者交谈。 – milleniumbug 2014-09-04 16:47:04

+2

似乎很奇怪你会用完全不同的签名来重载一个函数。 – 2014-09-04 16:47:28

回答

4

对于这个问题,我必须链接这个优秀的文章由赫布萨特:GotW #94 Solution: AAA Style (Almost Always Auto)

您可以从标题中阅读他的意见。他还带来了本指南其中的基本原理的文章中解释说:

指南:请记住,宁愿auto变量主要是由正确性,性能,可维护性和健壮性,只有最后大约打字方便动机。他称赞约auto

的主要方面是,它避免了不想要的隐式转换,其中,有在C++和它使呼叫者较少依赖于函数的接口有很多,因为在返回类型的变化中自动反映局部变量的类型。 auto在模板代码中也非常有用,因为您不必访问Container::value_type

2

这取决于。只要它比混淆更方便,那就使用它,否则不要。 对于一长串的论据和意见,我会参考另一个不同的问题:Use of var keyword in C#