2016-10-12 20 views
6

Tôi có đoạn mã sau:chuyển đổi ngầm và khai thác quá tải

struct helper { 
    template<typename T> helper(T const&); 
}; 

helper operator*(helper const&); 

struct A {}; 

int main() { 
    // (1) 
    A a; 
    sizeof(*a); 

    // (2) 
    int i; 
    sizeof(*i); 
} 

Trường hợp (1) biên dịch tốt và tôi hiểu rằng nó đang sử dụng chuyển đổi ngầm để loại helper và quá tải toán tử nhất định.

Đối với trường hợp (2), tuy nhiên, tôi nhận được một lỗi biên dịch:

invalid type argument of unary '*' (have 'int') 

Tại sao việc chuyển đổi ngầm sử dụng cho loại A nhưng không phải cho int?

Trả lời

8

Khi không có loại người dùng xác định được tham gia, bất kỳ nhà điều hành được giả định là một nhà điều hành được xây dựng trong. Vì vậy,

helper operator*(helper const&); 

không thể được tìm thấy cho *i khi i là được xây dựng trong loại (như int).

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