sách gpt4 ai đã đi

Lambda dương: '+[]{}' - Đây là phép thuật gì?

In lại Tác giả: IT Lao Gao Thời gian cập nhật: 2023-10-28 11:25:18 28 4
mua khóa gpt4 Nike

Câu hỏi Stack Overflow Tại sao không được phép định nghĩa lại lambda trong C++11? , đưa ra một chương trình nhỏ không thể biên dịch được:

int chính() {
kiểm tra tự động = []{};
kiểm tra = []{};
}

Câu hỏi đã được trả lời và mọi việc có vẻ ổn. Sau đó đã đếnJohannes SchaubVà sản xuấtmột quan sát thú vị :

Nếu bạn đặt một + trước lambda đầu tiên, nó bắt đầu hoạt động một cách kỳ diệu.

Vì vậy, tôi tò mò: tại sao cách sau lại có hiệu quả?

int chính() {
auto test = +[]{}; // Lưu ý toán tử đơn phân + trước lambda
kiểm tra = []{};
}

Nó liên quan đến GCC Có thể biên dịch 4.7+ và Kêu vang 3.2+. Bộ luật này có tuân thủ các tiêu chuẩn không?

1 Câu trả lời

Có, mã này tuân thủ các tiêu chuẩn. + Kích hoạt chuyển đổi thành con trỏ hàm thông thường thành lambda.

chuyện gì xảy ra:

Trình biên dịch nhìn thấy lambda đầu tiên ([]{}) và tạo ra một đối tượng đóng theo §5.1.2. Vì lambda là Không bắt giữ lambda, do đó điều sau đây được áp dụng:

5.1.2 Biểu thức lambda [expr.prim.lambda]

6 Kiểu đóng cho một biểu thức lambda không có lambda-chụp có hàm chuyển đổi public non-virtual non-explicit const thành con trỏ thành hàm có cùng tham số và kiểu trả về như toán tử gọi hàm của kiểu closure. Giá trị trả về bởi hàm chuyển đổi này sẽ là địa chỉ của hàm, khi được gọi, có cùng hiệu ứng như khi gọi toán tử gọi hàm của kiểu closure.

Điều này quan trọng vì toán tử đơn + Có một tập hợp các hàm quá tải tích hợp sẵn, đặc biệt là hàm này:

13.6 Các toán tử tích hợp [over.built]

8 Cho mọi loại T tồn tại các hàm toán tử ứng viên có dạng

    Toán tử T*+(T*);

Bằng cách này, có thể thấy rõ điều gì xảy ra: khi người vận hành + Khi áp dụng cho các đối tượng đóng, tập hợp ứng viên tích hợp của quá tải bao gồm các chuyển đổi thành các con trỏ tùy ý và kiểu đóng chỉ chứa một ứng viên: chuyển đổi thành con trỏ hàm thành lambda.

kiểm tra tự động = +[]{}; TRONGBài kiểm tra Loại do đó được suy ra làkhoảng trống(*)(). Bây giờ dòng thứ hai rất đơn giản: đối với đối tượng lambda/closure thứ hai, phép gán cho con trỏ hàm sẽ kích hoạt cùng một chuyển đổi như dòng đầu tiên. Mặc dù lambda thứ hai có kiểu đóng khác nhau nhưng con trỏ hàm kết quả tất nhiên là tương thích và có thể gán được.

Liên quan đến c++ - lambda dương: '+[]{}' - Đây là phép thuật gì?, 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/18889028/

28 4 0
CNTT Lao Gao
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com