问题标签 [stdinitializerlist]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
504 浏览

c++ - 要求纳入的理由是什么?

来自[dcl.init.list]

模板std​::​initializer_­list未预定义;如果标题 <initializer_list> 在使用之前不包括在内std​::​initializer_­list——即使是类型未命名的隐式使用——程序是非良构的。

既然std​::​initializer_­list是编译器的特殊情况,为什么它不被视为语言的一流语法?

我对一些可能性及其反驳的看法:

命名空间污染

可以这样解决std::size_t,包含标头仅引入标识符

请注意,auto sz = sizeof(0);即使不包含任何标题,它的格式也是正确的,而不是格式错误auto il = {1, 2, 3};

编译开销

libstdc++的实现std::initializer_list实际上少于 50 行,不依赖于其他头文件。那会有多大的开销?

0 投票
3 回答
263 浏览

c++ - 使用 {a,b,c} 作为参数的构造函数或 {a,b,c} 实际在做什么?

我知道,我可以像这样初始化数据。

甚至

我也可以这样做std::vector

假设我想编写自己的课程:

是否可以编写这样的构造函数,这怎么可能?这是什么声明

{{1, 2}, {3, 4}}实际上在做什么?

我总是发现,您可以以这种方式初始化数据,但永远不会精确地执行它。

0 投票
0 回答
85 浏览

c++ - 谁在`std::initializer_list`上?铿锵++还是g++?

在与一个我无法让std::initializer_list逻辑按预期工作的程序进行了长时间的斗争之后,我最终得到了一个小案例,我发现clang++6.0.1 和g++8.2.0 都在编译,但语义不同。

哪一个是正确执行该标准的?我试图通过阅读相关部分来自己理解规则,但我的大脑在尝试中爆炸了......

在特定的g++初始化y2为值列表(v指针被初始化),而clang++只是调用复制构造函数x

活生生的例子:

0 投票
2 回答
393 浏览

c++ - 将可变参数类型列表的扩展打包到复杂类型的初始值设定项列表中——合法吗?

我想将可变参数类型列表“具体化”为相关值的 initializer_list。例如,有std::tuple几个std::integral_constant<T, x>得到一个std::initializer_list<T>{...}. 在一般情况下,我想获得一些复杂类型的 initializer_list,比如std::string.

但是下面的简单示例在由 Clang 编译时给了我一个崩溃(尽管它适用于 GCC,至少在 Coliru 上),所以我怀疑 UB(或 Clang 中的错误):

住在科利鲁

那么,这样的代码合法吗?在 C++11/14/17 中?

0 投票
1 回答
320 浏览

c++ - 如何`static_assert`在成员初始化列表中构造模板类?

我有MyClass一个模板类。我想提供一个初始化 r 列表构造函数,以便我可以方便地编写:

另一方面,我不想在这个列表中有重复,因为这个类意味着只有唯一的用户输入。我见过很多方法来检查数组中的重复项,我想出了has_duplicates()以下函数。

我尝试结合检查std::initializer_list<T>ed 临时元素(或数组)是否在成员初始化器列表本身中包含任何重复元素的想法;如果它包含static_assert()模板实例化,则不会构造此类的任何对象。

以下是我的代码的最小示例。

在 MSVC 16.0(C++17 标志)中编译时,这给了我错误:

它说一个简单的语法错误,但我没有看到任何静态断言

谁能帮我找出错误?

std::initializer_list<T>在上述情况下,防止构造 constutor 参数的正确方法是什么?

0 投票
1 回答
63 浏览

c++ - std::initializer_list 构造函数导致编译器错误 C3202、C2661 和 C2976

我正在使用 C++ 教科书中包含的图形库,它对应该创建由直线组成的对象的形状具有以下定义。

但是,当我尝试创建 Lines 结构的实例时,如下所示:

我收到错误 C2976、C2228 和 C3202,说明:

C2976 - “std::pair': 模板参数太少”

C2228 - “pair”:非特化类模板不能用作模板参数 '_Elem' 的模板参数,需要一个真实类型”

C2661 - “Graph_lib::Lines::Lines':没有重载函数需要 3 个参数”

我的印象是 initializer_list 构造函数允许使用与参数相同类型的多个元素来初始化一个对象。

0 投票
3 回答
1126 浏览

c++ - 无法将 initializer_list 转换为类

我正在尝试为类模板初始化列表。我是一个新手,在这方面遇到了一些麻烦。main() 上的错误

错误 C2440:“正在初始化”:无法从“初始化程序列表”转换为“存储”

注意:没有构造函数可以采用源类型,或者构造函数重载决议不明确

0 投票
1 回答
76 浏览

c++ - 如何在构造函数调用中使用初始化列表来配置`std::vector>`?

大约一个小时前,我被指出了一个叫做初始化列表的东西,所以我立即开始研究它,但有一点我无法理解。

如果我有类似的东西:

问题是我希望这种情况发生:

等等。

我想要的是当我打电话时:

得到我写的例子:

是否有任何简短的方法可以使用初始化列表来做到这一点,或者我是否需要采取另一种方法(如果是这样的话)?

0 投票
2 回答
1275 浏览

c++ - 如何将 std::initializer_list 分配给向量

这是一个需要 std::initializer_list 的构造函数,我想将它分配给一个向量。我是否需要使用 for 循环将 std::initializer_list 中的每个项目一一分配给向量?

0 投票
1 回答
109 浏览

c++ - 如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?

我正在创建一个Matrix<type, width, height>我希望能够使用初始化的类initializer_list,例如:

该矩阵是使用T[height][width]二维数组实现的。

为此,我尝试制作一个构造函数,例如:

但是,我不知道如何从列表中填充数组。我努力了

  • 使用memcpy(损坏的内存),

  • std::copy(似乎无法从 复制 std::initializer_list),

  • 以及使用赋值运算符()构造函数调用(但二维数组不可赋值并且 () 构造函数调用无法编译)。

有没有其他方法,最好尽可能安全,来做到这一点?