2015-11-06 5 views
9

これは部分的にthisからインスピレーションを受けています。私はコードを書くとき:オペレータとの暗黙の変換

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

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

"test"を暗黙的にstd::stringconst char*から変換され、私が期待される出力を取得しています。しかし、私はこのしようとすると:

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項を追加」と言います。 50ページは過度に見える。 – user4581301

+0

実際、暗黙的な変換は、非プリミティブ型に対して予期されるように機能します。 [ここ](http://ideone.com/K4K2vS)を参照してください。 –