- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi dường như không thể hiểu tại sao tôi muốn sử dụngtoán tử gán di chuyển
:
LỚP & toán tử=(LỚP && khác); //toán tử gán di chuyển
kết thúc rồi,sao chép toán tử gán
:
LỚP & toán tử=(LỚP khác); // sao chép toán tử gán
toán tử gán di chuyển
Chỉ sử dụngtham chiếu giá trị r
,例如
LỚP a1, a2, a3;
a1 = a2 + a3;
hiện hữusao chép toán tử gán
ở giữa,other
có thể được sử dụngsao chép hàm tạo
hoặcdi chuyển hàm tạo
hàm tạo (nếu other
được khởi tạo bằng một giá trị, nó có thể được xây dựng di chuyển - nếu hàm tạo di chuyển
Đã xác định——).
nếu nó làđược xây dựng sao chép
, chúng ta sẽ làm 1 bản và không có cách nào tránh được bản đó.
nếu nó làdi chuyển-xây dựng
, thì hiệu suất/hành vi sẽ giống như hiệu suất/hành vi được tạo ra bởi tình trạng quá tải đầu tiên.
我的问题是:
1- Tại sao phải thực hiệntoán tử gán di chuyển
.
2- nếuother
được xây dựng từ một giá trị, thì trình biên dịch sẽ chọn giá trị nàotoán tử gán
? Tại sao?
câu trả lời hay nhất
Bạn không so sánh táo với táo
Nếu bạn đang viết một cái gì đó như std::unique_ptr
Đối với loại chỉ di chuyển như vậy, toán tử gán di chuyển sẽ là lựa chọn duy nhất của bạn.
Tình huống điển hình hơn là bạn có loại có thể sao chép được, trong trường hợp đó tôi nghĩ bạn có ba lựa chọn.
Toán tử T&=(T const&)
Toán tử T&=(T const&)
Và Toán tử T&=(T&&)
Toán tử T&=(T)
và di chuyểnLưu ý rằng việc sử dụng cả hai mức quá tải mà bạn đề xuất trong một lớp không phải là một tùy chọn vì nó tạo ra sự mơ hồ.
Tùy chọn 1 là tùy chọn C++98 truyền thống và sẽ hoạt động tốt trong hầu hết các trường hợp. Tuy nhiên, nếu bạn cần tối ưu hóa cho các giá trị r, bạn có thể xem xét tùy chọn 2 và thêm toán tử gán di chuyển.
Thật dễ dàng để xem xét tùy chọn 3 và chuyển theo giá trị rồi di chuyển, điều mà tôi nghĩ chính xác là những gì bạn đề xuất. Trong trường hợp đó, bạn chỉ cần viết toán tử gán. Nó chấp nhận các giá trị l và chỉ cần thực hiện thêm một bước để chấp nhận các giá trị r, điều mà nhiều người sẽ ủng hộ.
Tuy nhiên, Herb Sutter trong "Quay lại vấn đề cơ bản! Những yếu tố cần thiết của phong cách C++ hiện đại" Tại CppCon 2014, người ta đã chỉ ra rằng tùy chọn này có vấn đề và sẽ chậm hơn nhiều. Trong trường hợp giá trị lvalue, nó sẽ thực hiện sao chép vô điều kiện và sẽ không sử dụng lại bất kỳ dung lượng hiện có nào. Ông đã cung cấp những con số để chứng minh cho tuyên bố của mình. Ngoại lệ duy nhất là các hàm tạo, không có khả năng tái sử dụng hiện có và bạn thường có rất nhiều tham số, do đó việc truyền theo giá trị sẽ giảm số lượng quá tải cần thiết.
Vì vậy, tôi khuyên bạn nên bắt đầu với tùy chọn 1 và nếu bạn cần tối ưu hóa giá trị r thì hãy chuyển sang tùy chọn 2.
Về C++ - nên sử dụng cái nào: toán tử gán di chuyển và toán tử gán sao chép, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/26772146/
Trong ngữ cảnh của các hệ thống nhúng, cấu trúc hàm sau được đưa ra: Gán biến trả về có điều kiện: int foo(int x) { int status if (is_valid(x)) {
#input |--IDs-|--Value- |--da1-|--100---| |--da2-|---80---| --| |--da4-|--300---|
Bạn có thể khai báo danh sách các biến và gán cho chúng một giá trị nào đó trong Perl 6 my ($a, $b) = 33,44 # $a sẽ là 3
Một bản sao nông của một đối tượng được triển khai trong đoạn mã sau, nhưng các kết quả đầu ra khác nhau làm tôi bối rối: object.allocation: var obj = { name: 'wsscat', age: 0, add: { a: 'beijin
Tôi đang xem một số mã cũ của một nhà phát triển không còn tồn tại và nhận thấy rằng đôi khi anh ấy sử dụng Object.sign({}, xyz) và những thứ khác mà anh ấy đã sử dụng Object.sign([], abc); hai?
Câu hỏi này đã có câu trả lời ở đây: Tại sao các phương thức Đối tượng ES5 không được thêm vào Object.prototype? (2 câu trả lời) Đã đóng 4 tháng trước. tôi đang làm một cái
Tôi muốn biết sự khác biệt giữa: Object.sign(otherObject, { someNewProperty: '' }); và otherObject.someNewProperty = '
考虑以下代码: const defaultState = () => { return { profile: { id: '', displayName: '',
Tôi vừa tình cờ tìm thấy dòng mã TS này: const { title = item.text } = item Đây có vẻ là một phép xác định cấu trúc nhưng là các dấu ngoặc nhọn;
Tôi là người dùng JavaScript thiếu kinh nghiệm đang đọc cuốn sách CoffeeScript: Phát triển JavaScript tăng tốc trong đó tác giả tạo Scrabble
Khi tôi xem tệp nhật ký D:\SAS\XXX\Lev1\SASMain\BatchServer\Logs tôi thấy hai dòng này LƯU Ý: Libref TESTLIB đã gán thành công
Tôi dường như không hiểu tại sao toán tử gán di chuyển được sử dụng: CLASSA & operator=(CLASSA && other); //toán tử gán di chuyển đã kết thúc, toán tử gán di chuyển: CL
Trong Eiffel Studio, tôi đã cố gắng truy cập các trường của đối tượng của một lớp được xác định từ một lớp khác. Tuy nhiên, nó liên tục đưa ra những lỗi mà tôi không thể hiểu và giải quyết được. Sau đây là đoạn mã mẫu: Tạo lớp của đối tượng: lớp TEST1 feat
Tại sao đoạn mã này lại có trong Node (10.5) .then(function() { this = {...this, ...payload};
Tôi đang sử dụng gói sau để tạo thành phần Recaptcha trong ứng dụng React của mình: https://github.com/appleboy/react-recaptcha Thành phần này trông như thế này, với các cảnh báo eslint
Tôi có đoạn mã sau: #include #include sử dụng std::cout; struct SomeType { SomeType() {} SomeType(const Some
Tôi có ví dụ về mã này: var a = 10; ({a}) = 0; Trong Google Chrome, nó hiển thị lỗi: SyntaxError: mục tiêu gán phá hủy không hợp lệ Trong Firefox, nó hiển thị lỗi: Tham chiếu
Tôi có một hàm tính tổng đầu vào của hai trường đầu vào và gán nó cho một trường đầu vào. Hàm của tôi trông như thế này: function sum(id) { nextId = id+2 console.log
Tôi nhận được cảnh báo này "Vấn đề đếm tham chiếu tự động: Gán đối tượng được giữ lại cho biến không an toàn_unretained
Khi viết mã bằng ngôn ngữ Liquid của Shopify, tôi nhận thấy một số biến được gán theo cú pháp sau: {%- gán biến = value -%} và các biến khác được gán theo cú pháp sau: {% ass
Tôi là một lập trình viên xuất sắc, rất giỏi!