【发布时间】:2020-03-28 13:38:43
【问题描述】:
标准用简单的语言对Converting Constructor和Conversion Operator的优先级做了什么说明?
另外,我可以看到,当我有 2 个类 myClass 和 otherClass 并且我想将 otherClass 转换为 myClass 时,如下所示,转换运算符被调用为类 otherClass
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
所以,我的问题是为什么在第一种情况下从临时初始化与第二种情况不同?其次,为什么编译器在第二种情况下的行为会有所不同?
编辑:类定义为
#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;
}
【问题讨论】:
-
后一个示例背后的正式代码(显然)在 g++ 和 msvc 之间提供了不同的结果,这对您的问题很有启发性。 IE。包括类源和驱动主要。 IE。 minimal reproducible example,无论您认为它多么微不足道,包括相同工具链的版本。
-
显示代码。有几件事可能会影响这一点。
-
那仍然不是minimal reproducible example。一个完整的例子有#includes、
main等。在这种情况下,最好有一些输出,这样我们就可以判断是否实际调用了转换构造函数或转换函数。 -
更新了完整的代码 aschepler
-
myClass(otherClass&)应该是myClass(const otherClass&),顺便说一句。这应该可以解决您的 gcc 运行所抱怨的歧义。
标签: c++ type-conversion