2011-04-17 72 views
2

我讀過標準轉換可以在轉換運算符或構造器類型轉換實現的轉換之前或之後進行。在另一方面, 兩個轉換操作符的順序是不允許
2個構造器類型轉換的順序是不允許具有建立者類型轉換和轉換運算符的轉換序列

我的目標是測試這一點,得到了不同的結果。我正在使用MSVC2010

在第一組代碼中,這個失敗:int b1 = sMe;這很好,因爲它意味着兩個轉換運算符的序列:一個從myString到myType,另一個從myType到int

在第二組代碼中,此DOESNT失敗: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; 

} 

第二BUNCH

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; 

} 

回答

2

myString sYou(b);只涉及一個轉換。第二種轉換是顯式;你正在調用構造函數。所以它編譯。

相反,下面將編譯:

void func(myString blah) { ... } 

func(b); 

,因爲這將需要兩個隱式轉換。

+0

嗨,奧利,所以基本上這樣一個事實,即操作數在第二次轉換中匹配使其合法。只有兩個構造函數轉換的順序在它們都被隱含時不合法。那是對的嗎? – RandomCPlusPlus 2011-04-17 16:35:28

+0

@Random:就是這樣。爲了滿足參數列表,編譯器只會進行*一次*隱式轉換。 – 2011-04-17 16:36:48

+0

@oli:由於轉換運算符的存在,第一組代碼中的轉換都不明確嗎?如果這是正確的,他們仍然不編譯 – RandomCPlusPlus 2011-04-17 16:39:05