我正在阅读this文章
那
widget w = get_gadget(); -->a
auto w = get_gadget(); -->b
在声明中' a'创建临时,然后从临时构造移动小部件w。我完全理解这个说法。我不明白的是如何陈述' b'使用auto
变量优于声明' a'。它说
....我们可以写下面的内容,保证没有 隐式转换因为auto总是推断出基本类型 恰好:
//更好,如果你不需要一个明确的类型
auto w = get_gadget();
有人可以解释为什么声明' b'优于' a' ?
答案 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
作为该类型。但他的警告很重要:代码可以关注w
是gadget
而不是widget
。
例如,假设widget
继承自gadget
。声明b w
将是一个简单的gadget
,因此缺少您使用widget
获得的额外内容。使用陈述b时,您的代码无法关注您获得gadget
。如果您正在使用语句a
,那么您将获得widget
,但需要额外支付创建临时gadget
并将其转换为widget
的费用。