指定初始化器是从C中提取的功能,大多数C++编译器也是C编译器,并且它首先是C的一个特性。他们增加了一个限制(即必须按顺序初始化),并将其应用于与C类型匹配的C++类型,然后将其引入到C++中。大多数主要的C++编译器已经将其作为C++扩展实现(没有限制)。该限制被认为是合理的,而使此功能成为可能的“成本”非常低。
一旦你有了构造函数,它就变成了更大的语言问题。初始化程序是否涉及构造函数参数?如果是,则会遇到参数名称不唯一的问题。如果不是,那么当构造函数设置一个值而初始化器设置不同的值时,我们该如何处理呢?
基本上,我们需要通过名称来传递函数参数,以便在构造函数具有指定初始化器的情况下得到明智的结果。这是一个新功能,而不是简单地从C中提取的功能。
对于命名参数的解决方法是:
struct RawPoint{
int x = 0;
int y = 0;
int z = 0;
};
struct Point {
Point( int x_, int y_, int z_ = 0 ):
x(x_), y(y_), z(z_)
{}
explicit Point( RawPoint pt ):
Point( pt.x, pt.y, pt.z )
{}
int x, y, z;
};
接下来你可以这样做:
Point pt( {.x=3} );
通过访问
RawPoint
的指定初始化特性来实现。这与在函数调用中具有指定初始化器的方式相同。这也可以起作用:
struct Point:RawPoint {
Point( int x, int y, int z = 0 ):
RawPoint{x,y,z}
{}
explicit Point( RawPoint pt ):
RawPoint( pt )
{}
};