对于复杂的模板化类型,我一直在使用C++11标准中提供的新auto关键字,我相信它就是为此而设计的。但我也在使用它做一些事情,比如:
auto foo = std::make_shared<Foo>();更令人怀疑的是:
auto foo = bla(); // where bla() return a shared_ptr<Foo>我还没有看到太多关于这个话题的讨论。似乎auto可能会被过度使用,因为类型通常是一种文档和健全性检查的形式。使用auto的界限在哪里?这个新功能的推荐用例是什么?
需要澄清的是:我不是在询问哲学观点;我是在询问标准委员会对该关键字的预期用途,可能是关于该预期用途是如何在实践中实现的评论。
发布于 2011-06-22 12:51:39
我认为,只要第一眼很难说出如何编写类型,就应该使用auto关键字,但表达式右侧的类型是显而易见的。例如,使用:
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。
下面是一些示例:
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)发布于 2011-06-22 13:41:48
尽可能使用auto --尤其是const auto,这样副作用就不大了。除非在明显的情况下,否则您不必担心类型,但是仍然会为您静态地验证它们,并且您可以避免一些重复。在auto不可行的情况下,可以使用decltype将类型语义表示为基于表达式的约定。您的代码看起来会有所不同,但这将是一个积极的变化。
发布于 2011-09-19 22:31:37
很简单。当你不关心是什么类型的时候使用它。例如
for (const auto & i : some_container) {
...这里我所关心的是i是容器中的任何内容。
它有点像typedefs。
typedef float Height;
typedef double Weight;
//....
Height h;
Weight w;在这里,我不关心h和w是浮点型还是双精度型,只关心它们是适合表示高度和权重的任何类型。
或者考虑
for (auto i = some_container .begin (); ...在这里,我所关心的是它是一个合适的迭代器,支持operator++(),在这方面有点像鸭子类型。
另外,lambda的类型不能拼写,所以auto f = []...是很好的风格。另一种选择是强制转换为std::function,但这会带来开销。
我真的无法想象对auto的“滥用”。我所能想象到的最接近的情况是剥夺您自己显式转换为某种重要类型的权限--但是您不会为此使用auto,您将构造一个所需类型的对象。
如果你可以在不引入副作用的情况下移除代码中的一些冗余,那么it 就可以做到这一点。
反例(借用别人的答案):
auto i = SomeClass();
for (auto x = make_unsigned (y); ...)这里我们关心的是类型是什么,所以我们应该编写Someclass i;和for(unsigned x = y;...
https://stackoverflow.com/questions/6434971
复制相似问题