2015-11-06 3 views
9

Bu kısmen this sorusundan esinlenmiştir. Ben kodu yazarken:Operatör ile örtük dönüştürme

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

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

"test" örtülü std::string için const char* dönüştürüleceğini ve ben beklenen çıkışını almak edilir. Bunu deneyin Ancak,:

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; 
} 

Ben invalid operands of types 'int' and 'const char [2]' to binary 'operator*', derleyici hatası alıyorum. "a" dolaylı olarak std::string'a dönüştürülmedi, bunun yerine const char* kaldı. Derleyici neden bir işlev çağrısı durumunda örtük bir dönüştürme gereksinimini belirleyebilir, ancak bir operatörün durumu için uygun değildir?

cevap

8

Gerçekten de, operatörlerin diğer fonksiyonlardan farklı kuralları vardır. Bir ifadede, bir operatörün bir işlenen bir sınıf veya bir numaralandırma, olduğu varsayılır operatör bir tür varsa

bir Madde göre operatörün yerleşik ve yorumlanmış 5.

([over.match.oplantı]/1)

+3

Normal olarak, "Tamlık için 5. maddeyi ekleyin." ancak elli-şey sayfalar aşırı görünüyor. – user4581301

+0

Gerçekten de, örtük dönüştürme ilkel olmayan türler için beklenen şekilde çalışır; bakın [burada] (http://ideone.com/K4K2vS). –