有什么用的汽车?

时间:2014-01-12 00:23:40

标签: c++ c++11

我知道我们可以使用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的用途是什么? (除了定义基本类型)

3 个答案:

答案 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);