我读到标准转换可以在转换运算符或构造函数类型转换实现的转换之前或之后。另一方面,
两个转换运算符的序列是不允许的
两个构造器类型转换的序列是不允许的
我开始对此进行测试并得到了不同的结果。我正在使用 MSVC2010
在第一组代码中失败了:int b1 = sMe;这很棒,因为它暗示了两个转换运算符的序列:一个从 myString 到 myType,另一个从 myType 到 int
在第二组代码中,这不会失败:myString sYou(b);尽管我相信它暗示了两个构造函数转换的序列:一个从 int 到 myType,另一个从 myType 到 myString。
有人可以向我解释我错过了什么吗?
非常感谢,
第一批
class myType {
public:
myType(): val(10) {}
myType(const myType &orig): val(orig.val) {}
myType(int v1): val(v1) {}
bool hasSameValue(const myType &o2) {
return (o2.val == val); }
int getVal() {
return val; }
operator int() { return val; }
private:
int val;
};
#include <string>
class myString {
public:
myString(): val("I Dont Know you") {}
myString(const myString &orig): val(orig.val) {}
myString(myType v1): val("Really Dont know you") {}
bool hasSameValue(const myString &o2) {
return (o2.val == val); }
std::string getVal() {
return val; }
std::string getString() {return val;}
operator myType() { return 1000; }
private:
std::string val;
};
#include <iostream>
using namespace std;
int main() {
int b = 36;
myString sMe;
myString sYou(b);
cout << "sYou: " << sYou.getString() << endl;
cout << "sMe: " << sMe.getString() << endl;
myType a = sMe;
cout << a.getVal() << endl;
int b1 = sMe;
return 1;
}
第二组
class myType {
public:
myType(): val(10) {}
myType(const myType &orig): val(orig.val) {}
myType(int v1): val(v1) {}
bool hasSameValue(const myType &o2) {
return (o2.val == val); }
int getVal() {
return val; }
private:
int val;
};
#include <string>
class myString {
public:
myString(): val("I Dont Know you") {}
myString(const myString &orig): val(orig.val) {}
myString(myType v1): val("Really, I Dont Know you") {}
bool hasSameValue(const myString &o2) {
return (o2.val == val); }
std::string getVal() {
return val; }
std::string getString() {return val;}
private:
std::string val;
};
#include <iostream>
using namespace std;
int main() {
myType me;
int a = 34;
int b = 36;
myType you(a);
bool sameVal = you.hasSameValue(b);
cout << sameVal << endl;
cout << "you: " << you.getVal() << endl;
cout << "me: " << me.getVal() << endl;
myString sMe;
myString sYou(b);
cout << "sYou: " << sYou.getString() << endl;
cout << "sMe: " << sMe.getString() << endl;
return 1;
}
最佳答案
myString sYou(b);
只涉及一个隐式转换。第二次转换是明确的;你正在调用构造函数。所以它编译。</p>
相反,以下将不编译:
void func(myString blah) { ... }
func(b);
因为这需要两次隐式转换。
关于c++ - 具有构造函数类型转换和转换运算符的转换序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5694707/