首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++11 auto关键字多少才算太多?

使用C++11 auto关键字多少才算太多?
EN

Stack Overflow用户
提问于 2011-06-22 12:40:41
回答 15查看 49.6K关注 0票数 242

对于复杂的模板化类型,我一直在使用C++11标准中提供的新auto关键字,我相信它就是为此而设计的。但我也在使用它做一些事情,比如:

代码语言:javascript
复制
auto foo = std::make_shared<Foo>();

更令人怀疑的是:

代码语言:javascript
复制
auto foo = bla(); // where bla() return a shared_ptr<Foo>

我还没有看到太多关于这个话题的讨论。似乎auto可能会被过度使用,因为类型通常是一种文档和健全性检查的形式。使用auto的界限在哪里?这个新功能的推荐用例是什么?

需要澄清的是:我不是在询问哲学观点;我是在询问标准委员会对该关键字的预期用途,可能是关于该预期用途是如何在实践中实现的评论。

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2011-06-22 12:51:39

我认为,只要第一眼很难说出如何编写类型,就应该使用auto关键字,但表达式右侧的类型是显而易见的。例如,使用:

代码语言:javascript
复制
my_multi_type::nth_index<2>::type::key_type::composite_key_type::
    key_extractor_tuple::tail_type::head_type::result_type

即使您知道它是int,也要在boost::multi_index中获取组合键类型。您不能只编写int,因为它将来可能会被更改。在这种情况下,我会编写auto

因此,如果auto关键字在特定情况下提高了可读性,那么就使用它。当读者清楚地知道auto代表什么类型时,您可以编写auto

下面是一些示例:

代码语言:javascript
复制
auto foo = std::make_shared<Foo>();   // obvious
auto foo = bla();                     // unclear. don't know which type `foo` has

const size_t max_size = 100;
for ( auto x = max_size; x > 0; --x ) // unclear. could lead to the errors
                                      // since max_size is unsigned

std::vector<some_class> v;
for ( auto it = v.begin(); it != v.end(); ++it )
                                      // ok, since I know that `it` has an iterator type
                                      // (don't really care which one in this context)
票数 146
EN

Stack Overflow用户

发布于 2011-06-22 13:41:48

尽可能使用auto --尤其是const auto,这样副作用就不大了。除非在明显的情况下,否则您不必担心类型,但是仍然会为您静态地验证它们,并且您可以避免一些重复。在auto不可行的情况下,可以使用decltype将类型语义表示为基于表达式的约定。您的代码看起来会有所不同,但这将是一个积极的变化。

票数 64
EN

Stack Overflow用户

发布于 2011-09-19 22:31:37

很简单。当你不关心是什么类型的时候使用它。例如

代码语言:javascript
复制
for (const auto & i : some_container) {
   ...

这里我所关心的是i是容器中的任何内容。

它有点像typedefs。

代码语言:javascript
复制
typedef float Height;
typedef double Weight;
//....
Height h;
Weight w;

在这里,我不关心hw是浮点型还是双精度型,只关心它们是适合表示高度和权重的任何类型。

或者考虑

代码语言:javascript
复制
for (auto i = some_container .begin (); ...

在这里,我所关心的是它是一个合适的迭代器,支持operator++(),在这方面有点像鸭子类型。

另外,lambda的类型不能拼写,所以auto f = []...是很好的风格。另一种选择是强制转换为std::function,但这会带来开销。

我真的无法想象对auto的“滥用”。我所能想象到的最接近的情况是剥夺您自己显式转换为某种重要类型的权限--但是您不会为此使用auto,您将构造一个所需类型的对象。

如果你可以在不引入副作用的情况下移除代码中的一些冗余,那么it 就可以做到这一点。

反例(借用别人的答案):

代码语言:javascript
复制
auto i = SomeClass();
for (auto x = make_unsigned (y); ...)

这里我们关心的是类型是什么,所以我们应该编写Someclass i;for(unsigned x = y;...

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6434971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档