定义转换构造函数和转换运算符时,哪一个优先?编译器为什么不同于此转换



用简单的语言来说,标准对转换构造函数转化运算符的优先级有什么规定?

此外,我可以看到,当我有两个类myClassotherClass,并且我想将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是良好形成的,因为只有一个用于转换的有效候选者。转换构造函数不是有效的候选者,因为对非常量的左值引用不能绑定到右值。

最新更新