C 11 auto 关键字太多了?

新手上路,请多包涵

我一直在使用新的 auto 关键字在 C++11 标准中用于复杂的模板类型,我相信这是为它设计的。但我也将它用于以下方面:

 auto foo = std::make_shared<Foo>();

更怀疑的是:

 auto foo = bla(); // where bla() return a shared_ptr<Foo>

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

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

原文由 Alan Turing 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 647
2 个回答

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

 my_multi_type::nth_index<2>::type::key_type::composite_key_type::
    key_extractor_tuple::tail_type::head_type::result_type

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

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

这里有些例子:

 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)

原文由 Kirill V. Lyadvinsky 发布,翻译遵循 CC BY-SA 4.0 许可协议

auto 做什么?

它告诉编译器根据变量的初始化值推断(确定)变量的数据类型。它使用类型推导。

应该在哪里使用 auto

  • 当您对了解变量的类型不感兴趣并且只想使用它时。

  • 当您想避免令人难以置信的长而丑陋的类型名时。

  • 当你不确定自己的类型时。

  • 当您不想在代码中看到未初始化的变量时,即自动强制您初始化变量,因此您不能忘记这样做。

什么时候不应该使用或 auto

  • 参考其功能, auto 可能会错误地推断类型,其中一种情况是
>  std::vector<bool> vec(10, 0);
>
>  auto x = vec[2];
>
>  bool y = vec[2];
>
>  std::cout << typeid(x).name() << "\n";
>
>  std::cout << typeid(y).name() << "\n";
>
> ```

G++ 10.2 的输出令人惊讶:

St14_Bit_reference

b

”`

  • 如果您想让您的代码对其他人可读和可理解,则不应使用它。它对读者隐藏了数据类型的可见性。

原文由 TonyParker 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题