相关疑难解决方法(0)

为什么std :: initializer_list不是内置的语言?

为什么不std::initializer_list内置核心语言?

在我看来,它是C++ 11的一个非常重要的特性,但它没有自己的保留关键字(或类似的东西).

相反,initializer_list只是来自标准库的模板类,它具有来自编译器处理的新braced-init-list语法的特殊隐式映射. {...}

起初认为,这个解决方案非常黑客.

这是现在实现C++语言新增功能的方式:通过某些模板类的隐式角色而不是核心语言?


请考虑以下示例:

   widget<int> w = {1,2,3}; //this is how we want to use a class
Run Code Online (Sandbox Code Playgroud)

为什么选择了新课程:

   widget( std::initializer_list<T> init )
Run Code Online (Sandbox Code Playgroud)

而不是使用类似于以下任何想法的东西:

   widget( T[] init, int length )  // (1)
   widget( T... init )             // (2)
   widget( std::vector<T> init )   // (3)
Run Code Online (Sandbox Code Playgroud)
  1. 一个经典阵列,你可以在const这里和那里添加
  2. 语言中已经存在三个点(var-args,现在是可变参数模板),为什么不重用语法(并让它感觉内置)
  3. 只是一个现有的容器,可以添加const&

所有这些都已经成为语言的一部分.我只写了我的第一个想法,我相信还有很多其他方法.

c++ std initializer-list c++11

93
推荐指数
3
解决办法
8765
查看次数

何时使用初始化列表构造函数?

使用{}而不是()在构造函数中允许我在头文件中使用特定构造函数初始化类成员,如下所示:

class X {
    private:
        std::vector y{1, 2, 3};
};
Run Code Online (Sandbox Code Playgroud)

但是,我如何知道对于Z我使用的类Z z{a, b};将调用具有两个参数的构造函数Z::Z(int a, int b)- 而不是具有std::initializer_list?的那个?

我的意思是std::complex(1, 2)std::complex{1, 2}是相同的,但std::vector(3)std::vector{3}肯定不是.

除非我需要,我是否应该总是使用{}变体或使用?(){}

c++ initializer-list c++11

2
推荐指数
1
解决办法
1464
查看次数

标签 统计

c++ ×2

c++11 ×2

initializer-list ×2

std ×1