为什么 Vector<double> 接受整数元素initializer_list?
why vector<double> accepts initializer_list with integer elements?
#include <iostream>
#include <vector>
int main()
{
// case I: uniform initialization
//
int ii = 100;
// Error: cannot be narrowed from type 'int' to 'double'
// in initializer list
//
double dd{ ii };
// case II: initializer_list
//
std::vector<double> vecDouble{ 1, 2.2 }; // fine!
// case III: initializer_list
//
std::vector<int> vi = { 1, 2.3 }; // error: double to int narrowing
// case IV: intializer_list
// cannot be narrowed from type 'int' to 'double'
//
std::vector<double> vecD2{ ii, 2.2 }; // Error
}
为什么caseI不接受int到double的转换,而caseI允许转换,这是不一致的。
长话短说,这是有效的,因为从常量表达式int
转换为double
是而不是缩小转换。换句话说,这与以下代码工作的原因相同:
double x { 1 };
编译器需要构造用于大括号初始化的std::initializer_list<E>
。它知道E
的类型是double
,因为您正在初始化std::vector<double>
。C++11标准第8.5.4节对此进行了详细说明。
以下是第8.5.4.3节中的一个示例:
struct S { S(std::initializer_list<double>); // #1 S(const std::string&); // #2 // ... }; const S& r1 = { 1, 2, 3.0 }; // OK: invoke #1
同一节定义了缩小转换如下:
缩小转换是一种隐式转换
- 从浮点类型转换为整数类型,或者
- 从长double到double或float,或从double到float,除非源是常量表达式,并且转换后的实际值在可以表示的值范围内(即使无法准确表示),或
- 从整数类型或无范围枚举类型转换为浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型,并在转换回原始类型时产生原始值,或者
- 从整数类型或无范围枚举类型转换为不能表示原始类型的所有值的整数类型,除非源是一个常量表达式,其值在整数提升后将适合目标类型
具有ii
的两个示例属于第三类,即当源是而不是常量表达式时,从int
转换为double
。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化