'auto'关键字有什么意义?

sir*_*lot 8 c++ c++11

所以我理解var在C#中使用是有意义的,因为你有编译器派生的匿名类型.C++似乎没有这个功能(除非我错了),那么拥有一个auto关键字有什么意义呢?

(与C#不同,它有点酷,auto适用于成员/全局变量,我觉得这很酷,但似乎不足以证明它的存在).

Rap*_*ptz 33

auto 当涉及到泛型编程并为程序员节省一些打字时,它有很多用途.

例如,考虑一下.你愿意输入:

std::unique_ptr<name::long_type::goes_here> g = 
    std::make_unique<name::long_type::goes_here>(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

要么:

auto g = std::make_unique<name::long_type::goes_here>(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

是的,它们都很长但我们知道返回类型并再次指定它有点麻烦.这也适用于迭代器:

for(auto i = vec.begin(); ...)
Run Code Online (Sandbox Code Playgroud)

VS:

for(std::vector<type>::iterator i = vev.begin(); ...)
Run Code Online (Sandbox Code Playgroud)

它在泛型编程中的用途也是为了找出一个函数的返回类型,或者如果你正在做一些你不知道类型的通用算法.

例如,考虑一个非常基本的例子.

template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
    return t + u;
}
Run Code Online (Sandbox Code Playgroud)

这允许编译器找出添加操作的类型,而不是我们试图自己弄清楚它.请注意,在C++ 14中,您可以省略尾随返回类型.它在泛型编程中的用途也不止于此.如果我们想使用任何类型的容器作为算法的包装函数,我们可以使用auto它来帮助我们.例如:

template<class Cont>
void my_sort(Cont&& cont) {
    using std::begin;
    auto first = begin(std::forward<Cont>(cont));
    // work with the iterators here
}
Run Code Online (Sandbox Code Playgroud)

在将来(C++ 14)中,auto也可用于制作多态lambda,例如:

[](auto a) { return a + 4; }
Run Code Online (Sandbox Code Playgroud)

哪个也很有用.

  • @sircodesalot C++ 14是一个"次要"版本.没有C++ 11那么大,但是带来了一些非常好的东西,比如多态lambda,可选,省略函数的尾随返回类型和其他有趣的东西. (2认同)
  • @NicolBolas:差异化,VS很贵...... (2认同)

Yak*_*ont 15

auto在C++ 中有许多用途

  1. 匿名函数对象,也就是闭包,也就是lambda实例. auto是存储它们的唯一方法.类型也可以从这些类型和背面类型中生成,无限制地生成.

  2. C++可以具有相当复杂的类型,例如非变异迭代器的类型,它使用自定义分配器和散列函数的无序映射. typedef可以减轻这一点,但m.begin()具有特定名称的类型不具有信息性:foo_iterator it =具有意义auto foo_iterator =,并且auto其他地方不需要样板.

  3. 返回类型推导使用auto关键字,这是执行某些template功能所必需的,没有大量的特征样板.消除样板是一个常见的主题:C++的健壮类型系统意味着类型可以携带大量信息,并且在每次使用时对其进行编码都会适得其反.

  4. 在一些ducktype template代码中,推导变量类型的工作与编码变量值的工作大致相同,并且在结构上几乎相同,有时候字面上:decltype(long expression) x = long expression;. auto消除了重复.

  5. 最后在C++ 1y中,类型演绎lambdas auto用来表示参数是推导出的.重量轻template.谈到扩展到非lambdas也在臭鼬工作.

  • +1!你比我更好地组织了你的想法. (2认同)

Del*_*ore 5

HEre是一个真实的例子,我不能,不使用auto

我试图在C++中执行switch类型语句,其中返回类型是特定于实现的,并且无法轻松声明.所以使用'auto'可能是解决地图声明类型查找的正确方法.

auto foo = boost::bind(&VegaFactory::load_commodity_one_leg,this,conn,_1);
std::map<std::string,decltype(foo)> methods;
methods.insert(std::make_pair("FOO",commodityOneLeg));

auto f = methods.find(bar);
// Call f here
Run Code Online (Sandbox Code Playgroud)