什么是汽车总是推断出基本类型的意思

时间:2015-10-04 03:54:33

标签: c++11

我正在阅读this文章

widget w = get_gadget(); -->a
auto w = get_gadget();   -->b

在声明中' a'创建临时,然后从临时构造移动小部件w。我完全理解这个说法。我不明白的是如何陈述' b'使用auto变量优于声明' a'。它说

  

....我们可以写下面的内容,保证没有   隐式转换因为auto总是推断出基本类型   恰好:

     

//更好,如果你不需要一个明确的类型

     

auto w = get_gadget();

有人可以解释为什么声明' b'优于' a' ?

2 个答案:

答案 0 :(得分:3)

这取决于您的标准是什么"更好"。

如果get_gadget()的返回类型实际上是widget,那将永远是真的,那么就没有任何区别。但是,实际程序设计会发生变化,可能需要更改返回类型,或更改返回类型的属性。

如果get_gadget()的返回类型是可以隐式转换为gadget的内容(比如widget),那么" a"实际上是

gadget temp = get_gadget();
widget w = widget(temp);    //   assuming widget has a constructor that accepts a gadget

gadget temp = get_gadget();
widget w = (gadget)widget;    //   assuming gadget has an implicit conversion to widget

在任何一种情况下,都会创建一个临时对象,然后执行一些转换。

相比之下,案例" b"由编译器推断为

gadget w = get_gadget();

使用auto可能还有维护优势。我们假设get_gadget()gadget)的返回类型已更改,因此无法再将其转换为widget。在这种情况下,案例" a"根本就不会编译。案例" b"将编译,使用w的代码仍然有效(假设新的返回类型支持其上的所有操作)。

虽然可以通过更改为

轻松修复最后一种情况
gadget w = get_gadget();

即使通过将get_gadget()的返回类型更改为better_gadget,也可以再次将其打破。

底线是auto将工作交给编译器担心需要w类型。

答案 1 :(得分:2)

Sutter在段落中解释道。

  

这是有效的,假设小工具可以隐式转换为小部件,但会创建一个临时对象。这是一个潜在的性能缺陷,因为在代码审查中单独阅读呼叫站点时,临时对象的创建并不明显。如果我们可以在此调用代码中使用小工具以及小部件,因此不需要提交到小部件类型,我们可以编写以下内容以保证没有隐式转换,因为auto总是会完全推断出基本类型

语句b直接创建gadget。这绕过了临时和转换的创建,这可能是昂贵的操作,具体取决于类的实现。 auto选择所需的确切类型,并直接创建w作为该类型。但他的警告很重要:代码可以关注wgadget而不是widget

例如,假设widget继承自gadget。声明b w将是一个简单的gadget,因此缺少您使用widget获得的额外内容。使用陈述b时,您的代码无法关注您获得gadget。如果您正在使用语句a,那么您将获得widget,但需要额外支付创建临时gadget并将其转换为widget的费用。