我知道我们可以使用auto
之类的:
auto a = 1;
auto b = Foo(1,2);
或者在函数调用中:
auto foo(){
return Foo(1,2);
}
但是C ++ 11还提供了统一的初始化和初始化列表,所以我们可以这样做:
Foo a {1,2};
Foo b = {1,2};
Foo foo(){
return {1,2};
}
如果我们已经有大括号语法,那么auto
的用途是什么? (除了定义基本类型)
答案 0 :(得分:6)
我认为当你使用好的'迭代器'时,可以看到auto
的最佳用法。比较:
for (std::vector<int>::iterator it = vector.begin(); it != vector.end(); ++it)
为:
for (auto it = vector.begin(); it != vector.end(); ++it)
尽管在C ++ 11中我们有更好的范围,但是在范围没有明确定义或需要对元素执行操作的情况下,迭代器仍然被广泛使用。
通常,当编译器可以自动推断类型(即要键入的PITA)时,auto
会很有用。
答案 1 :(得分:3)
当返回类型未指定时,您需要自动。例如,std::bind
。
using namespace std::placeholders;
int n = 7;
auto f1 = std::bind(f, _2, _1, 42, std::cref(n), n);
答案 2 :(得分:1)
auto
最适合模板和迭代器。
它不仅可以真正简化语法并提高代码可读性,而且还可以废弃一些广泛的模板使用。
查看this guy's page - 非常好,非常重要。
以下内容:
template <typename BuiltType, typename Builder>
void makeAndProcessObject (const Builder& builder) {
BuiltType val = builder.makeObject();
// ...
}
现在使用auto
,你可以摆脱模板中的多种类型:
template <typename Builder>
void makeAndProcessObject (const Builder& builder)
{
auto val = builder.makeObject();
// ...
}
此外,当您实际调用此函数时,您不需要提供任何类型作为模板参数:
MyObjBuilder builder;
makeAndProcessObject(builder);