clang和gcc中的这个警告似乎不正确
This warning in clang and gcc doesn't seem to be correct
我相信Bjarne Stroutrup新书TCPL第4版第66页中的示例有一个小错误,因为class Vector_container
没有std::initializer_list
构造函数。此处的错误消息证实了这一点。
#include <iostream>
class Vector{
double* elem;
int sz;
public:
Vector(int s):elem{new double[s]}, sz{s} { for(int i = 0; i != sz; ++i) elem[i]= 0; }
Vector(std::initializer_list<double> lst): elem{new double[lst.size()]}, sz(lst.size()) { std::copy(lst.begin(), lst.end(), elem); }
~Vector() { delete[] elem; }
double& operator[](int i) { return elem[i]; }
int size() const { return sz; }
};
class Container{
public:
virtual double& operator[](int i) = 0;
virtual int size() const = 0;
virtual ~Container() {}
};
class Vector_container:public Container{
Vector v;
public:
Vector_container(int s): v{s}{}
~Vector_container() {}
double& operator[](int i) { return v[i]; }
int size() const {return v.size(); }
};
void use(Container& c)
{
const int sz = c.size();
for(int i = 0; i != sz; i++) std::cout << c[i] << 'n';
}
int main()
{
Vector_container vc{10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
use(vc);
}
但是,在Vector_container(int)
构造函数的成员初始值设定项列表中为表达式v{s}
发出的警告让我感到惊讶,因为它说:warning: narrowing conversion of 's' from 'int' to 'double' inside { }
,这似乎不正确,因为在这种情况下没有缩小范围。
此外,如果将main()
中的表达式Vector_container vc{10, ..., 1};
更改为Vector_container vc{10};
,则错误消息会如预期的那样消失,但警告会继续显示。尽管如此,根据标准中的13.3.1.7/1,Vector
类的std::initializer-list
构造函数是由编译器选择的,我认为这是正确的。
因此,我想知道是否有任何方法可以强制调用Vector(int)
构造函数,而不是Vector
类中的初始值设定项列表ctor,在最后一个例子中使用Vector_container vc{10};
。
您对过载分辨率的看法是正确的:在内部
Vector_container(int s): v{s}{}
初始化CCD_ 14选择以下构造函数:
Vector(std::initializer_list<double> lst)
根据[over.match.list]/1。
当从{s}
创建std::initializer_list<double>
时,其中s
的类型为int
,存在从int
到double
(n3485)[dcl.init.list]/7 的缩小转换
缩小转换是一种隐式转换
- […]
- 从整数类型或无范围枚举类型到浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型,并且在转换回原始类型时生成原始值,或者
- […]
注意这里的s
不再是常量表达式(作为参数)。缩小转换可能不会出现在std::initializer_list
对象的构造中,[dcl.init.list]/5
如果缩小转换需要初始化任何元素,则程序格式不正确。
所以这个警告应该是一个错误(或者它是一个扩展)。
因此,我想知道是否有任何方法可以强制调用
Vector(int)
构造函数,而不是Vector
类中的初始值设定项列表ctor。
我不确定我是否正确理解了你(请参阅对OP的评论),但这里不使用list init解决了问题:
Vector_container(int s): v(s) {} // initializer-list ctor not viable
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- [[maybe_unused]] 在成员变量上,GCC 警告(不正确?)该属性被忽略
- libc++ 持续时间隐藏警告不正确
- clang和gcc中的这个警告似乎不正确
- 如何删除关于负偏移的警告,这些警告在正确的流分支的情况下永远不会发生
- 缺少编译器警告,大括号初始值设定项不正确
- libpng 警告:iCCP:已知不正确的 sRGB 配置文件