std::initializer_list不允许缩小
std::initializer_list does not allow narrowing
我有这个Vector类,但它给出了错误。
narrowing conversion of ‘lst.std::initializer_list<_E>::size [with _E = double, std::initializer_list<_E>::size_type = long unsigned int]()’ from ‘std::initializer_list<double>::size_type {aka long unsigned int}’ to ‘int’ inside { } [-fpermissive]
但如果我把sz{lst.size()}
改成sz{(int)lst.size()}
,那没关系。如果有人能帮我解释一下,我将不胜感激。我在IDE中使用(代码:Blocks IDE(启用的C++0x。编译器GCC(Ubuntu/Linaro 4.6.3-1ubuntu5(4.6.3
#include <iostream>
#include <vector>
#include <list>
#include <initializer_list> // std::initializer_list
class Vector
{
double* elem;
int sz;
public:
Vector(int s):elem{new double[s]}, sz{s}
{
for(int i = 0; i != s; i++)
elem[i] = 0;
}
~Vector()
{
delete[] elem;
}
double& operator[] (int i);
int size() const;
void push_back(double);
//Compilation ERROR:
Vector(initializer_list<double> lst):elem{new double[lst.size()]},sz{lst.size()}
{
//copy(lst.begin(), lst.end(), elem);
}
//THIS IS OK
/* Vector(initializer_list<double> lst):elem{new double[lst.size()]},sz{(int)lst.size()}
{
//copy(lst.begin(), lst.end(), elem);
} */
};
问题是您要求将类型为size_t
(例如,64无符号整数(的lst.size()
隐式转换为int
(例如,32位有符号整数(。在大括号初始化的上下文中,这是一个狭窄的转换,具有潜在的危险性。
[dcl.init.list]缩小转换是一种隐式转换。。。从整数类型或无范围枚举类型到不能表示原始类型的所有值的整数类型,。。。
缩小转换规则仅用于支持的初始值设定项列表,即int a{1}
,而不用于使用()
的经典初始化(即int a(1)
(。
所以有三条出路:
-
使用
std::size_t
作为sz
的类型。sz
表示存储块的长度,因此std::size_t
是正确的类型。(推荐( -
使用显式转换
sz{static_cast<int>(lst.size())}
。 -
在构造函数中使用
()
而不是{}
。(不推荐(Vector(initializer_list<double> lst) : elem(new double[lst.size()]), sz(lst.size()) // ^^^ ^^^
相关文章:
- 为什么 Clang 不允许"and"作为函数名称?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么 c++ 不允许(自动)强制转换?
- 为什么 c++11 不允许使用自动
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么不允许使用可变长度数组作为向量元素?
- 余数除法和不允许除以零 (c++) 时遇到问题
- C++从外部类继承的嵌套类;不允许使用不完整的类型
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 不允许在类定义之外重写
- 不允许运算符 const 参数调用 const 成员函数
- E0322:不允许使用抽象类类型 " " 的对象
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- std::initializer_list不允许缩小