繁体   English   中英

默认初始化与默认构造值的复制初始化

[英]Default initialization vs. copy initialization from default-constructed value

thing成为一个默认可构造和可移动构造的类型。 考虑以下两个初始化:

thing t1;          // (1)
auto t2 = thing{}; // (2)
  • (1)default-constructs t1

  • (2)default-构造一个临时类型的thing并将其移动到t2

在哪种情况下,(2)中的举动会被省略?

在现代风格的C ++初始化中,类型通常根本不显示或出现在右侧。 例如:

auto copy = vec;                              // Type doesn't appear

auto p_derived = std::make_unique<derived>(); // Type appears naturally on the right

// Putting the type on the right here makes it explicit that the upcast is intended
auto p_base = std::unique_ptr<base>{ std::make_unique<derived>() };

使用(2)将与那些样式一致,而使用(1)则不会。

此外,当使用(1)长型名称时,变量名称显示在右侧。 使用(2)时,无论typename有多长,变量名都是同样明显的。

这是否意味着为了一致性,(2)优于(1)?

哪个更好是意见问题。 我不会权衡,这不是什么原因。

每个支持C ++ 11的现代编译器都会忽略该移动,除非您将显式编译器标志传递给永远不会丢弃的东西。

在C ++ 17中,没有移动到elide; thing{}是一个prvalue,prvalues不是C ++ 17中的对象,而是创建对象的指令(可以实例化一个匿名临时对象,但在这种情况下不是)。

auto x = prvalue ; 语句使prvalue指令用于构造x

在哪种情况下,(2)中的举动会被省略?

当编译器选择忽略时。 这实际上总是在现代编译器上。 但是,C ++ 11(也不是C ++ 14)中没有保证的复制省略。

使用(2)将与那些样式一致,而使用(1)则不会。

这是否意味着为了一致性,(2)优于(1)?

为了一致性,一致性几乎没有优势。

理解为什么类型在示例中是正确的,以及为什么(这意味着) auto存在是很有用的。 类型在右侧,因为模板实例化需要它。 仍然一个类型必须在左侧也具有声明的语法。 该类型也是右手表达式的返回类型,因此引入了auto以允许从该表达式中进行推导。 这是有利的,因为我们避免了类型的脆弱重复。

(1)没有重复,因此引入auto时没有重复数据删除优势。 没有右手表达,也没有必要引入一个。 (2)有不必要的额外样板,以及该类型可移动的附加要求。

此外,当使用(1)长型名称时,变量名称显示在右侧。 使用(2)时,无论typename有多长,变量名都是同样明显的。

在我看来,这是一个微弱的论点。 你应该避免使用不必要的长类型名称,但是如果你遇到了一个类型名称,你可以简单地将它们放在不同的行中:

thing_with_extra_long_type_name_for_some_reason<omg_it_doesnt_end>
  t1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM