C++ 叮当声和gcc中的此警告不';似乎不对
我相信Bjarne Strutrup的新书TCPL第四版第66页中的示例有一个小错误,因为C++ 叮当声和gcc中的此警告不';似乎不对,c++,c++11,constructor,initializer-list,C++,C++11,Constructor,Initializer List,我相信Bjarne Strutrup的新书TCPL第四版第66页中的示例有一个小错误,因为class Vector\u容器没有std::initializer\u 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
class Vector\u容器
没有std::initializer\u 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);
}
#包括
类向量{
双*元素;
int sz;
公众:
向量(ints):elem{new double[s]},sz{s}{for(inti=0;i!=sz;++i)elem[i]=0;}
向量(std::initializer_list lst):elem{new double[lst.size()]},sz(lst.size()){std::copy(lst.begin(),lst.end(),elem);}
~Vector(){delete[]elem;}
双重&运算符[](int i){返回元素[i];}
int size()常量{return sz;}
};
类容器{
公众:
虚拟双运算符[](int i)=0;
虚拟整数大小()常量=0;
虚拟~Container(){}
};
类向量_容器:公共容器{
向量v;
公众:
向量容器(ints):v{s}{}
~Vector_container(){}
双精度&运算符[](int i){返回v[i];}
int size()常量{返回v.size();}
};
无效使用(容器和c)
{
常量int sz=c.size();
对于(inti=0;i!=sz;i++)std::cout关于重载分辨率,您是正确的:Inside
Vector_container(int s): v{s}{}
初始化v{s}
选择以下构造函数:
Vector(std::initializer_list<double> lst)
在Vector\u container(int s)
内部,s
不是一个常量表达式,因此有一个从int
到double
的缩小转换。clang++3.5说这是一个错误,而不仅仅是一个警告。“因此,我想知道是否有任何方法可以强制调用Vector(int)
构造函数。”不要在Vector\u容器(int s)
?-->Vector\u容器(int s):v(s){}
@dyp不要在Vector\u容器(int s)中使用列表初始化?
但是如果你想在类中保留这个构造函数呢?我不确定你指的是哪个构造函数。@dyp我想说的是:如何强制向量(int)构造函数在向量类中维护初始值设定项列表构造函数?向量容器(int s):v(s){
这正是我想要的。通过这种方式,你可以强制调用向量(int)构造函数。回答得好。Tks。另一个“统一初始化”的陷阱。也许如果它不包括std::initializer_list
-初始化,那么它就不会那么复杂,也不会那么令人惊讶了…当std::initializer_list是从{s}创建的,其中s是int类型时,从int到double(n3485)[dcl.init.list]/7
的转换范围会缩小,但是这种所谓的“缩小”转换?@WakeupBrazil你的意思是,为什么他们会使格式错误?这是个好问题,如果int
的所有值都可以用浮点类型表示。这一定与浮点有关,因为允许在整数之间进行类似的转换。
Vector_container(int s): v(s) {} // initializer-list ctor not viable