eXX*_*XX2 5 c++ templates type-conversion
我有这个代码.在主要我想要使用类型转换,但使用调试我明白在这一行
ob2=(Point2D<double>)ob1;
template <class T1> Point2D(Point2D<T1>& ob)无论explicit以前调用构造函数,template <class T1> explicit Point2D(Point2D<T1>& ob)为什么会发生这种情况?我希望这operator Point2D<T1>()是被调用的.
template <class T>
class Point2D
{
public:
T x;
T y;
Point2D(T _x=0,T _y=0):x(_x),y(_y)
{
}
Point2D(Point2D& ob)
{
x=ob.x;
y=ob.y;
}
template <class T1>
Point2D(Point2D<T1>& ob)
{
x=ob.x;
y=ob.y;
}
template <class T1>
operator Point2D<T1>()
{
return Point2D<T1>(x,y);
}
};
int main()
{
Point2D<int> ob1(10,10);
Point2D<double> ob2(20,20);
ob2=(Point2D<double>)ob1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
[dcl.init]标准的一部分指定在初始化期间首选构造函数:
\n\n如果目标类型是(可能是 cv 限定的)类类型:
\n\n
\n- 如果初始化是直接初始化,或者是复制初始化,其中源类型的 cv 未限定版本与目标类是同一类或目标类的派生类,则考虑构造函数。枚举适用的构造函数(13.3.1.3),并通过重载决议选择最好的构造函数(13.3)。调用如此选择的构造函数来初始化对象,并使用初始化表达式或表达式列表作为其参数。如果没有应用构造函数,或者重载决策不明确,则初始化格式错误。
\n- 否则(即,对于其余的复制初始化情况),可以从源类型转换为目标类型或(当使用转换函数时)为其派生类的用户定义的\xef\xac\x81ned转换序列是如 13.3.1.4 中所述枚举,并通过重载决策(13.3)选择最好的一个。如果转换无法完成或不明确,则初始化格式错误。使用初始值设定项表达式作为其参数来调用所选函数;如果该函数是构造函数,则调用会初始化目标类型的 cv 未限定版本的临时版本。临时值是纯右值。然后,根据上述规则,调用的结果(对于构造函数情况来说是临时的)用于直接初始化作为复制初始化目标的对象。在某些情况下,允许实现通过将中间结果直接构造到正在初始化的对象中来消除直接初始化中固有的复制;见12.2、12.8。
\n
此规则意味着仅当没有应用构造函数时才考虑用户定义的转换序列。
\n强制转换使用与初始化相同的规则,请参阅[expr.static.cast]:
\n\n对于某些发明的临时变量(8.5),如果声明格式良好,则
\ne可以T使用以下static_cast形式将表达式显式转换为类型。static_cast<T>(e)T t(e);t
和[expr.cast]:
\n\n执行的转换
\n\n
\n- ( 5.2.11
\nconst_cast),- (
\nstatic_cast5.2.9),- 一个
\nstatic_cast后接一个const_cast,- a
\nreinterpret_cast(5.2.10),或- 一个
\nreinterpret_cast后接一个const_cast,可以使用显式类型转换的强制转换表示法来执行。
\n
另请注意[class.conv.ctor]:
\n\n显式构造函数像非显式构造函数一样构造对象,但仅在显式使用直接初始化语法 (8.5) 或强制转换 (5.2.9、5.4) 时才这样做。
\n