2015-11-06 113 views
9

這部分受this問題的啓發。當我寫的代碼:與運算符的隱式轉換

void test(std::string inp) 
{ 
    std::cout << inp << std::endl; 
} 

int main(void) 
{ 
    test("test"); 
    return 0; 
} 

"test"被隱式地從const char*轉換爲std::string,我也得到預期的輸出。然而,當我嘗試這樣的:

std::string operator*(int lhs, std::string rhs) 
{ 
    std::string result = ""; 

    for(int i = 0; i < lhs; i++) 
    { 
    result += rhs; 
    } 

    return result; 
} 

int main(void) 
{ 
    std::string test = 5 * "a"; 
    return 0; 
} 

我得到編譯器錯誤,invalid operands of types 'int' and 'const char [2]' to binary 'operator*'"a"在這裏並未隱式轉換爲std::string,而是保持爲const char*。爲什麼編譯器能夠在函數調用的情況下確定是否需要隱式轉換,而不是運算符的情況?

回答

8

事實上,運營商與其他類型的功能有不同的規則。

如果在表達式無操作者的操作數具有類型,它是一個類或一個枚舉,操作員被假定 是一個內置的操作和解釋根據條款5.

([over.match.oper]/1)

+3

通常我會說,「爲了完整性添加第5條。」但五十頁的頁面似乎過度。 – user4581301

+0

事實上,隱式轉換的工作方式與非原始類型相同;見[這裏](http://ideone.com/K4K2vS)。 –