向量构造函数对:初始化列表与显式构造

Narut Sereewattanawoot

我将std::pair<vector<int>, int>构造器称为两种方式:

  • 传入初始化列表
  • 传递显式向量(r值)。

出于某种原因,初始化器列表版本会进行复制(并销毁一个副本)。
这是我的最小代码示例:

auto dummy() {
    return pair<vector<int>, int>{ {1,2,3,4,5}, 1};
}

auto dummy1() {
    return pair<vector<int>, int>{ vector{1,2,3,4,5}, 1};
}

auto dummy2() {
    return optional<vector<int> > { {1,2,3,4,5} };
}

检查编译器资源管理器后,我发现初始化器列表dummy()版本调用了operator new两次,并调用delete一次。既不使用显式构造版本dummy1()也不使用中的类似std::optional构造函数dummy2()我不会期望这种行为。有人知道为什么吗?我也检查了c。

霍尔特

问题来自std::pair构造函数和模板参数推导/重载解析:

pair( const T1& x, const T2& y ); // (1)

template< class U1, class U2 >
pair( U1&& x, U2&& y );           // (2)

请注意,至少有一个“缺失”的构造函数:

pair( T1&& x, T2&& y );           // (3)

当对第一个参数使用列表初始化时,所选的构造函数不是(2)(with U1 = std::initializer_list<int>)而是(1)1因此,您需要构造一个临时的std::vector<int>,它作为-的const引用传递(1),必须进行复制。

您可以通过以下任一方法凭经验确认:

  • pair使用上述第三个构造函数创建自己的对象-在这种情况下,(3)将选择临时对象vector并将其移动;
  • 显式构造一个std::initializer_list<int>while,构造std::pair
pair<vector<int>, int>{ std::initializer_list<int>{1,2,3,4,5}, 1 };

另一方面,std::optional作为单个模板构造函数:

template < class U = value_type >
constexpr optional( U&& value );

...但是有一个默认值U,使该构造函数成为重载解析的有效候选者。


1调用时pair{ {1,2,3,4,5}, 1 }U1(2) [temp.deduct.type]#5.6的非推论上下文中,因此推论失败,因此(1)选择了为什么

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

显式构造函数和嵌套的初始化列表

来自分类Dev

具有成员初始化列表的显式副本构造函数中的空值

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

空向量的构造函数列表初始化

来自分类Dev

如何在定义附近使用显式的长度/值构造函数初始化向量成员变量?

来自分类Dev

无法从委派构造函数的初始化列表中初始化向量

来自分类Dev

如何在不显式调用显式构造函数的情况下初始化映射?

来自分类Dev

从初始值设定项列表初始化向量时,为什么不使用移动构造(通过隐式构造函数)

来自分类Dev

基本/默认构造函数与构造函数初始化列表

来自分类Dev

为什么在具有主构造函数的记录中需要显式的“ this”构造函数初始化器?

来自分类Dev

为什么可以在构造函数中使用成员初始化来满足显式构造函数的参数呢?

来自分类Dev

为什么在调用构造函数之前进行显式初始化

来自分类Dev

C ++ 11:带“ = {}”的类内初始化不适用于显式构造函数

来自分类Dev

显式构造函数和std :: initializer_list初始化

来自分类Dev

我是否需要在构造函数中显式初始化std :: unique_ptr?

来自分类Dev

是否可以编写有助于复制初始化的显式构造函数?

来自分类Dev

如何为显式重载的构造函数启用副本初始化?

来自分类Dev

显式初始化没有默认构造函数的成员

来自分类Dev

类组合构造函数d必须显式初始化引用成员

来自分类Dev

错误:构造函数必须显式初始化引用成员

来自分类Dev

如何在varargs构造函数的初始值设定项列表中初始化向量?

来自分类Dev

将初始化列表传递给基于向量的构造函数

来自分类Dev

在类构造函数中初始化const向量(C ++)

来自分类Dev

在构造函数 C++ 中初始化结构向量

来自分类Dev

使用构造函数的参数初始化向量成员

来自分类Dev

在 sfml 的构造函数中初始化向量数组

来自分类Dev

C ++在初始化列表之外显式调用父构造函数

来自分类Dev

如何避免在C ++中显式构造在初始化列表中继承的所有内容?

来自分类Java

为什么要在所有构造函数中显式初始化空白的最终变量?

Related 相关文章

  1. 1

    显式构造函数和嵌套的初始化列表

  2. 2

    具有成员初始化列表的显式副本构造函数中的空值

  3. 3

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  4. 4

    空向量的构造函数列表初始化

  5. 5

    如何在定义附近使用显式的长度/值构造函数初始化向量成员变量?

  6. 6

    无法从委派构造函数的初始化列表中初始化向量

  7. 7

    如何在不显式调用显式构造函数的情况下初始化映射?

  8. 8

    从初始值设定项列表初始化向量时,为什么不使用移动构造(通过隐式构造函数)

  9. 9

    基本/默认构造函数与构造函数初始化列表

  10. 10

    为什么在具有主构造函数的记录中需要显式的“ this”构造函数初始化器?

  11. 11

    为什么可以在构造函数中使用成员初始化来满足显式构造函数的参数呢?

  12. 12

    为什么在调用构造函数之前进行显式初始化

  13. 13

    C ++ 11:带“ = {}”的类内初始化不适用于显式构造函数

  14. 14

    显式构造函数和std :: initializer_list初始化

  15. 15

    我是否需要在构造函数中显式初始化std :: unique_ptr?

  16. 16

    是否可以编写有助于复制初始化的显式构造函数?

  17. 17

    如何为显式重载的构造函数启用副本初始化?

  18. 18

    显式初始化没有默认构造函数的成员

  19. 19

    类组合构造函数d必须显式初始化引用成员

  20. 20

    错误:构造函数必须显式初始化引用成员

  21. 21

    如何在varargs构造函数的初始值设定项列表中初始化向量?

  22. 22

    将初始化列表传递给基于向量的构造函数

  23. 23

    在类构造函数中初始化const向量(C ++)

  24. 24

    在构造函数 C++ 中初始化结构向量

  25. 25

    使用构造函数的参数初始化向量成员

  26. 26

    在 sfml 的构造函数中初始化向量数组

  27. 27

    C ++在初始化列表之外显式调用父构造函数

  28. 28

    如何避免在C ++中显式构造在初始化列表中继承的所有内容?

  29. 29

    为什么要在所有构造函数中显式初始化空白的最终变量?

热门标签

归档