C++中的auto关键字——方便与困惑

3

我开始学习C++11,目前对于 "auto" 关键字有爱恨交加的感觉。

毫无疑问,它很方便。

但它也很令人困惑,以下是一段代码:

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

在这段代码中,get_w() 函数返回 "struct S*",这是 w 的类型。但是 struct S 有两个重载的 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>)。
但是实际上,很容易就会迷失方向。
这在编译时被捕获是很好的,但我想我的初步热情正在减退。
你怎么想?有什么提示吗?

7
我认为这里的问题在于混淆了常量重载。这两种类型是完全无关的。你可能需要与结构体 S 的作者进行交流。 - milleniumbug
2
似乎有些奇怪,你会用完全不同的签名来重载一个函数。 - user3920237
1
我认为这主要是基于个人观点的。有些人觉得auto很棒,而另一些人则讨厌它,还有介于两者之间的微妙差别。选择你自己的微妙差别吧 :) 我确实同意有时会感到困惑,但另一方面,我大多数情况下都使用auto来进行迭代器操作。我遵循的一个经验法则是它不应该令人困惑。然后,“困惑”的定义可能因人而异... - JBL
2
此外,如果get_i()返回一个 unique_ptr<I>&,那么auto i = w->get_i();将无法编译。 - T.C.
2
你的代码问题不在于使用 auto,而在于选择了像 fooget_wget_ibar 这样糟糕的命名。 - fredoverflow
显示剩余2条评论
2个回答

4
对于这个问题,我需要链接Herb Sutter的这篇优秀文章:GotW#94解决方案:AAA样式(几乎总是自动)
从标题中可以读出他的观点。他还提出了这个指南,其原理在文章中得到了解释:
指南:记住,偏爱auto变量主要基于正确性、性能、可维护性和健壮性,只有最后才涉及类型便利性。
他赞扬auto的主要方面是它避免了不必要的隐式转换,在C++中有很多这样的情况,并且它使调用者不那么依赖函数接口,因为返回类型的更改会自动反映在本地变量的类型中。auto在模板代码中也非常有用,因为您不必访问例如Container::value_type

2

这要看情况而定。如果使用var更方便而不会引起混淆,那就用它,否则就不用。 关于var关键字的使用,有很多争议和观点,你可以参考另一个不同的问题:C#中var关键字的使用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接