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.
Nguồn
2012-12-19 12:45:27
'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