2015-11-06 25 views
9

Phần này được lấy cảm hứng từ câu hỏi this. Khi tôi viết mã:Chuyển đổi ngầm định với nhà điều hành

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

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

"test" được ngầm chuyển đổi const char*-std::string, và tôi nhận được đầu ra dự kiến. Tuy nhiên, khi tôi thử điều này:

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

Tôi gặp lỗi trình biên dịch, invalid operands of types 'int' and 'const char [2]' to binary 'operator*'. "a" không được chuyển đổi hoàn toàn thành std::string tại đây, thay vào đó nó vẫn là const char*. Tại sao trình biên dịch có thể xác định sự cần thiết cho một chuyển đổi ngầm định trong trường hợp của một cuộc gọi hàm, nhưng không phải cho trường hợp của một toán tử?

Trả lời

8

Thật vậy, các toán tử có các quy tắc khác nhau từ các loại hàm khác.

Nếu không có toán hạng của toán tử trong một biểu thức có một kiểu đó là một lớp hoặc một điều tra, các nhà điều hành được giả định là một built-in điều hành và giải thích theo quy định tại khoản 5.

([over.match.oper]/1)

+3

Thông thường tôi muốn nói, "Thêm vào khoản 5 để hoàn thành". nhưng năm mươi trang gì đó dường như quá mức. – user4581301

+0

Thật vậy, chuyển đổi tiềm ẩn hoạt động như dự đoán cho các loại không nguyên thủy; xem [ở đây] (http://ideone.com/K4K2vS). –

Các vấn đề liên quan