2014-09-19 13 views
20

Có thể bắt đầu khởi tạo lambda thành viên inline và sử dụng con trỏ this không?Có thể inline lambda initializer chụp 'this' pointer?

struct A{ 
    int a = 42; 
    int b = [this](){ 
    return this->a * 4; 
    }(); 
}; 

Mã hợp lệ C++ 11 (theo đặc điểm kỹ thuật) hay chỉ là phần mở rộng GCC?

Nếu nó hợp lệ, tại sao tôi phải sử dụng this-> khi đề cập đến thành viên a?

+1

Loại câu hỏi này sẽ được đăng trên StackOverflow! Chào mừng bạn! :) – Mikhail

+0

dễ dàng kiểm tra với tùy chọn '-pedantic' –

+0

Nó làm việc với' -pedantic' với cả GCC 4.7 và clang 3.2 – p2rkw

Trả lời

16

Có hợp lệ C++ 11 mã không? Chỉ

số lambdas trong phạm vi khối có thể có danh sách chụp:

C++ 11 5.1.2/9 Một lambda-biểu mà nhỏ nhất kèm theo phạm vi được một phạm vi khối được một biểu thức lambda cục bộ; bất kỳ khác biểu thức lambda sẽ không có danh sách chụp trong số lambda-introducer.

Vì vậy, có vẻ như đây là phần mở rộng GCC. (Như đã đề cập trong các ý kiến, đây là một open issue, vì vậy cũng có thể trở thành tiêu chuẩn trong một ngày.)

tại sao tôi phải sử dụng this-> khi đề cập đến thành viên một?

Bạn không, ít nhất với phiên bản GCC tôi đang sử dụng: http://ideone.com/K857VC.

+0

Tôi giả sử N3797 lặp lại một chút: 'Một biểu thức lambda có phạm vi bao quanh nhỏ nhất là một phạm vi khối (3.3.3) là một biểu thức lambda cục bộ; bất kỳ biểu thức lambda nào khác sẽ không có capture-default hoặc capture đơn giản trong lambda-giới thiệu của nó.' –

+0

@MarcoA .: Cảm ơn, tôi chỉ muốn xem liệu điều này có thay đổi trong C++ 14 hay không. Điều đó không thay đổi câu trả lời; bạn vẫn không thể nắm bắt 'this' (là một * đơn giản chụp *) trong một lambda phi địa phương. –

+1

OTOH, vì NSDMIs về cơ bản là đường cú pháp cho danh sách khởi tạo thành viên của hàm khởi tạo, có thể cho rằng nó có hiệu quả khối phạm vi (hoặc một cái gì đó tương tự với nó) ... –

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