std :: initializer_list作为构造函数的模板参数

用户名

考虑一个从std容器继承的类,该类具有模板构造函数,该构造函数调用容器的基础构造函数。此模板构造函数适用于简单的复制和移动构造函数,但不适用于initializer_list ctor。

template<typename container_T>
class test : public container_T {
public:
  using container_type = container_T;

  test() {} 

  // templated constructor
  template<typename T>
  test(T t)
    : container_T(t) {}

   // without this it won't compile
  test(std::initializer_list<typename container_T::value_type> l)
    : container_T(l) {}
};

int main() {    
  test<std::deque<int>> vdi1;
  test<std::deque<int>> vdi2({1,2,3,4,5,6,7,8,9});

  std::cout << "vdi2 before:" << std::endl;
  for(auto it : vdi2)
    std::cout << it << std::endl;

  test<std::deque<int>> vdi3(std::move(vdi2));

  std::cout << "vdi2 before:" << std::endl;
  for(auto it : vdi2)
    std::cout << it << std::endl;

  std::cout << "vdi3 before:" << std::endl;
  for(auto it : vdi3)
    std::cout << it << std::endl;

  return 0;
}

如果删除该initializer_list构造函数,vdi2将无法编译。所以我的问题是:为什么模板构造函数不能推断initializer_list?并且有可能这样做吗?

卡西欧内里

为什么没有通过模板化构造函数推导出initializer_list?

原因是这{1,2,3,4,5,6,7,8,9}只是一个没有类型的合意构造。因此,编译器无法推导出T该合一构造的类型,并且第一个构造器失败。

但是,通过特殊的标准规则std::initializer_list<T>(除其他外)可以从这种合意性构造中构造T出来,可以推导为int因此,第二个构造函数起作用。

通过与函数模板参数类型推导进行对比,

auto x = {1,2,3,4,5,6,7,8,9};

编译器将x的类型设置为std::initializer_list<int>还有一些特殊的标准规则规定必须如此。严格来说,这不是类型推断,因为如上所述,{1,2,3,4,5,6,7,8,9}没有类型推断。(在这里发生的唯一类型推导是T = int在中std::initializer_list<T>。)在这里,编译器选择(不推论)x为be的类型std::initializer_list<int>在任何情况下,使用说的类型x被推导为的语言滥用都是没有害处的std::initializer_list<int>

最后,正如DyP在评论中所说,您可能想要的是从基本容器类继承所有构造函数(不仅是带有一个参数的构造函数)。您可以通过删除当前拥有的所有构造函数并将此行添加到以下方式来执行此操作test

using container_type::container_type;

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: initializer_list作为模板类中的构造函数参数

来自分类Dev

std :: initializer_list作为std :: array构造函数

来自分类Dev

如何防止std :: string使用initializer_list构造函数?

来自分类Dev

构造函数中的std :: initializer_list转换

来自分类Dev

使用std :: initializer_list参数的非成员函数(/非构造函数上下文)的重载解析

来自分类Dev

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

来自分类Dev

为什么使用std :: initializer_list的构造函数不喜欢使用双花括号语法

来自分类Dev

如何使用带有std :: initializer_list的构造函数设计类?

来自分类Dev

从initializer_list错误构造一个std :: map

来自分类Dev

作为std :: initializer_list对象的抽象类

来自分类Dev

std :: initializer_list的实现

来自分类Dev

C ++-std :: initializer_list与std :: span

来自分类Dev

为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

来自分类Dev

如何不使用std :: initializer_list定义初始值设定项列表构造函数?

来自分类Dev

std :: vector作为模板函数参数

来自分类Dev

从std :: array私有继承时,无法从std :: initializer_list构造

来自分类Dev

std :: initializer_list和引用类型

来自分类Dev

返回并自动推断std :: initializer_list

来自分类Dev

在clang中返回std :: initializer_list

来自分类Dev

C ++ std :: initializer_list用法

来自分类Dev

std :: initializer_list可以专用吗?

来自分类Dev

std :: initializer_list和引用类型

来自分类Dev

类支撑初始化被误解为std :: initializer_list而不是副本构造

来自分类Dev

C ++ 11可以构造一个std :: initializer_list吗?

来自分类Dev

函数作为std :: function包装器的构造函数的参数

来自分类Dev

具有initializer_list和size的std :: unordered_map构造函数在main中进行编译,但在类定义中未进行编译

来自分类Dev

C ++ SFINAE双嵌套的initializer_list与可变参数模板构造函数

来自分类Dev

std :: make_shared与std :: initializer_list共享

来自分类Dev

std::function 作为委托构造函数中的参数

Related 相关文章

  1. 1

    std :: initializer_list作为模板类中的构造函数参数

  2. 2

    std :: initializer_list作为std :: array构造函数

  3. 3

    如何防止std :: string使用initializer_list构造函数?

  4. 4

    构造函数中的std :: initializer_list转换

  5. 5

    使用std :: initializer_list参数的非成员函数(/非构造函数上下文)的重载解析

  6. 6

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

  7. 7

    为什么使用std :: initializer_list的构造函数不喜欢使用双花括号语法

  8. 8

    如何使用带有std :: initializer_list的构造函数设计类?

  9. 9

    从initializer_list错误构造一个std :: map

  10. 10

    作为std :: initializer_list对象的抽象类

  11. 11

    std :: initializer_list的实现

  12. 12

    C ++-std :: initializer_list与std :: span

  13. 13

    为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

  14. 14

    如何不使用std :: initializer_list定义初始值设定项列表构造函数?

  15. 15

    std :: vector作为模板函数参数

  16. 16

    从std :: array私有继承时,无法从std :: initializer_list构造

  17. 17

    std :: initializer_list和引用类型

  18. 18

    返回并自动推断std :: initializer_list

  19. 19

    在clang中返回std :: initializer_list

  20. 20

    C ++ std :: initializer_list用法

  21. 21

    std :: initializer_list可以专用吗?

  22. 22

    std :: initializer_list和引用类型

  23. 23

    类支撑初始化被误解为std :: initializer_list而不是副本构造

  24. 24

    C ++ 11可以构造一个std :: initializer_list吗?

  25. 25

    函数作为std :: function包装器的构造函数的参数

  26. 26

    具有initializer_list和size的std :: unordered_map构造函数在main中进行编译,但在类定义中未进行编译

  27. 27

    C ++ SFINAE双嵌套的initializer_list与可变参数模板构造函数

  28. 28

    std :: make_shared与std :: initializer_list共享

  29. 29

    std::function 作为委托构造函数中的参数

热门标签

归档