2012-12-19 21 views
19

Sự khác nhau giữa is_convertibleis_assignable là gì?Sự khác nhau giữa is_convertible is_assignable

Tại sao,

trong vs2012

is_convertible<int, int&> is false 

is_assignable<int, int&> is true 

trong gcc4.7.2

is_convertible<int, int&> is false 

is_assignable<int, int&> is false 
+1

'is_convertable ' đang chuyển đổi A thành B, trong khi 'is_assignable ' đang gán B cho A. Lưu ý cách chúng được chuyển đổi một phần thứ tự các đối số. – Pubby

Trả lời

9

Một điểm khác biệt là đối số là cách khác.

is_convertible<From,To> có nghĩa là một biểu thức thuộc loại From có thể được chuyển đổi thành loại To. Tiêu chuẩn xác định điều này theo chức năng trả về To chứa một dòng return create<From>(); trong đó create<From>() trả về tham chiếu đến From. Vì vậy, is_convertible<int,int&> là sai, vì bạn không thể ràng buộc một giá trị rvalueint thành một tham số không lvalueint&.

is_assignable<T,U> có nghĩa là một rvalue biểu hiện của loại U thể được gán cho một biểu hiện của loại T; nghĩa là, t = u; được thiết lập tốt. Biểu thức được gán cho được chỉ định làm cuộc gọi hàm trả lại tham chiếu lvalue nếu T là tham chiếu lvalue và tham chiếu rvalue khác. Điều này có nghĩa là is_assignable<T,U> chỉ có thể đúng nếu T là loại tham chiếu không phải là lvalue; do đó là sai cho <int,int&>.

Tôi cho rằng VS2012 hoặc cho phép gán cho xvalues ​​ hoặc sử dụng séc không chuẩn cho is_assignable, cho kết quả không chính xác.

Lưu ý rằng trong chuyển đổi chung không ngụ ý có thể gán, vì có thể không có toán tử gán có thể truy cập; và gán được không ngụ ý chuyển đổi, vì có thể có một toán tử gán nhưng không có toán tử chuyển đổi hoặc toán tử chuyển đổi có thể truy cập nào.

+0

Như tôi đã chỉ ra trong câu trả lời khác, đó là năm 2012 là sai, hãy xem: Xem thông số kỹ thuật hoặc http://en.cppreference.com/w/cpp/types/is_assignable. is_assignable thêm tham chiếu giá trị r vào tham số đầu tiên, vì vậy trừ khi nó là tham chiếu giá trị l, nó sẽ trả về false. – yiding

+0

Tôi có nhầm lẫn giữa các tham chiếu và giá trị rvalue không? – yiding

+0

@yiding: Tôi nghĩ rằng tôi cũng có thể bị bối rối. Một đọc kỹ các tiêu chuẩn dường như cho thấy rằng bạn và GCC là chính xác, tuy nhiên kỳ quặc có vẻ như. –

3

Có vẻ như một lỗi trong gcc, is_convertible trong bối cảnh này có nghĩa là:

int& foo() 
{ 
    return 3; //invalid 
} 

Mặt khác han d is_assignable trong ngữ cảnh này có nghĩa là:

void foo(int& x, int y) 
{ 
    y = x; // valid 
} 
+1

'int y = x;' có vẻ giống như khởi tạo hơn là gán. – Pubby

+0

@Pubby Cảm ơn, đã sửa –

+0

Về mặt kỹ thuật 'is_assignable ' kiểm tra rằng một tham chiếu rvalue của int '(int &&)' có thể được gán cho từ tham chiếu của int. tham chiếu rvalue không thể được chỉ định bất cứ điều gì, và đó là lý do tại sao nó phải là sai. – yiding

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