问题标签 [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.
c++ - 要求纳入的理由是什么?
模板
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 行,不依赖于其他头文件。那会有多大的开销?
c++ - 使用 {a,b,c} 作为参数的构造函数或 {a,b,c} 实际在做什么?
我知道,我可以像这样初始化数据。
甚至
我也可以这样做std::vector
假设我想编写自己的课程:
是否可以编写这样的构造函数,这怎么可能?这是什么声明
{{1, 2}, {3, 4}}
实际上在做什么?
我总是发现,您可以以这种方式初始化数据,但永远不会精确地执行它。
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 中?
c++ - 如何`static_assert`在成员初始化列表中构造模板类?
我有MyClass
一个模板类。我想提供一个初始化 r 列表构造函数,以便我可以方便地编写:
另一方面,我不想在这个列表中有重复,因为这个类意味着只有唯一的用户输入。我见过很多方法来检查数组中的重复项,我想出了has_duplicates()
以下函数。
我尝试结合检查std::initializer_list<T>
ed 临时元素(或数组)是否在成员初始化器列表本身中包含任何重复元素的想法;如果它包含static_assert()
模板实例化,则不会构造此类的任何对象。
以下是我的代码的最小示例。
在 MSVC 16.0(C++17 标志)中编译时,这给了我错误:
它说一个简单的语法错误,但我没有看到任何静态断言。
谁能帮我找出错误?
std::initializer_list<T>
在上述情况下,防止构造 constutor 参数的正确方法是什么?
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 构造函数允许使用与参数相同类型的多个元素来初始化一个对象。
c++ - 无法将 initializer_list 转换为类
我正在尝试为类模板初始化列表。我是一个新手,在这方面遇到了一些麻烦。main() 上的错误
错误 C2440:“正在初始化”:无法从“初始化程序列表”转换为“存储”
注意:没有构造函数可以采用源类型,或者构造函数重载决议不明确
c++ - 如何在构造函数调用中使用初始化列表来配置`std::vector>`?
大约一个小时前,我被指出了一个叫做初始化列表的东西,所以我立即开始研究它,但有一点我无法理解。
如果我有类似的东西:
问题是我希望这种情况发生:
等等。
我想要的是当我打电话时:
得到我写的例子:
是否有任何简短的方法可以使用初始化列表来做到这一点,或者我是否需要采取另一种方法(如果是这样的话)?
c++ - 如何将 std::initializer_list 分配给向量
这是一个需要 std::initializer_list 的构造函数,我想将它分配给一个向量。我是否需要使用 for 循环将 std::initializer_list 中的每个项目一一分配给向量?
c++ - 如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?
我正在创建一个Matrix<type, width, height>
我希望能够使用初始化的类initializer_list
,例如:
该矩阵是使用T[height][width]
二维数组实现的。
为此,我尝试制作一个构造函数,例如:
但是,我不知道如何从列表中填充数组。我努力了
使用
memcpy
(损坏的内存),std::copy
(似乎无法从 复制std::initializer_list
),- 以及使用赋值运算符和
()
构造函数调用(但二维数组不可赋值并且 () 构造函数调用无法编译)。
有没有其他方法,最好尽可能安全,来做到这一点?