用简单的语言来说,标准对转换构造函数和转化运算符的优先级有什么规定?
此外,我可以看到,当我有两个类myClass
和otherClass
,并且我想将otherClass
转换为myClass
,如下所示,则会为类otherClass
调用Conversion操作符
myClass mc = otherclass();//creates temp for otherClass
这种行为在gcc和MSVC中是相同的。
但当我做下面这样的事情时,上面的编译器的这种行为是不同的-
otherClass oC;
myClass mc = oC;//for gcc (C++11): Ambiguous, for MSVC: calls myClass Conversion Constructor
所以,我的问题是,为什么在第一种情况下从临时初始化与第二种情况不同?其次,为什么编译器在第二种情况下会有不同的行为?
EDIT:定义为的类
#include <iostream>
using namespace std;
class otherClass;
class myClass {
public:
myClass(){}
myClass(otherClass&) {
cout << "called myClass's conversion constructor" << endl;
}
};
class otherClass {
public:
operator myClass () {
cout << "called otherClass's conversion operator" << endl;
return myClass ();
}
};
int main()
{
otherClass oc;
myClass mc = oc;
myClass mc1 = otherClass();
return 0;
}
当定义转换构造函数和转换运算符时,哪个优先
两者都没有。
编译器为什么会对这种转换有所不同?
如果转换序列不明确,则表示程序格式不正确。因此,编译器被允许不生成程序,并被要求诊断问题。故意允许这种模棱两可的转换将被视为一种语言扩展,但无论扩展是什么,如果不进行诊断,则是不符合标准。
如果转换序列是明确的,并且没有其他原因导致程序格式错误,那么拒绝编译它的编译器就不符合标准。
编辑:关于添加的示例:myClass mc = oc
的转换确实不明确,并且程序格式不正确。因此,行为差异的一个可能原因要么是允许它的编译器的语言扩展,要么是编译器错误。如果未进行诊断,则编译器不符合标准。我建议禁用语言扩展。
CCD_ 8是良好形成的,因为只有一个用于转换的有效候选者。转换构造函数不是有效的候选者,因为对非常量的左值引用不能绑定到右值。