我有以下两个班级:
class B;
class A
{
public:
A();
operator B() const;
};
class B
{
public:
B2();
};
这里,A将隐式转换运算符定义为B类。然后C ++引用说如下:“如果存在从new_type到表达式类型的隐式转换序列,则不包括左值到右值,数组到指针,函数到指针,空指针,空成员指针,或者布尔转换,然后static_cast可以执行隐式转换的反转“。这意味着要编译以下内容
A a;
B b=a;
A a1=static_cast<A> (b);
但是Xcode给出了错误消息
答案 0 :(得分:5)
您的C ++参考资料不精确。 标准(C ++14§5.2.9/ 7)说,
任何标准转换序列(第4章)的反转,不包含左值到右值(4.1),数组到指针(4.2),函数到指针(4.3),空指针(4.10), null成员指针(4.11)或布尔值(4.12) 转换可以使用
static_cast
显式执行。
请注意,它表示标准转换顺序。 static_cast
无法执行用户定义转换的反转。也不难看出为什么会这样;如果static_cast
需要执行用户定义的转换序列的反转,则必须具有反转任意算法的能力。例如,如果A
包含一对整数且B
包含一个整数,并且A::operator B()
将两个整数相乘,那么逆必须将整数计算为{{1} }} ...