2016-11-11 18 views
7

này biên dịch:Tại sao [] có thể thay đổi {} không biên dịch?

[]{}; 

này cũng như:

[]() mutable {}; 

Nhưng với mã này, trình biên dịch ném thông báo lỗi tại tôi:

[] mutable {}; 
    ^~~~~~~ 
error: lambda requires '()' before 'mutable' 

Có bất kỳ lý do cụ thể tại sao?

+2

@BaummitTiêu chuẩn đọc và hiểu là một kỹ năng của riêng nó (đặc biệt nếu tiếng Anh không phải là ngôn ngữ đầu tiên của bạn), vì vậy bạn có thể đặt câu hỏi như vậy là IMHO. – Slava

+0

@BaummitAugen Tôi đã tự hỏi, nếu có bất kỳ lý do cụ thể nào, tiêu chuẩn chỉ định nó theo cách đó. Nếu không, thì có, tôi muốn điều này được thay đổi, bởi vì tôi tình cờ gặp điều này nhiều lần. –

+0

@RalphTandetzky Tôi không thể nghĩ ra một lý do chính đáng, rất có thể là một sự giám sát. Viết một đề xuất để thay đổi nó! – TartanLlama

Trả lời

5

Nó chỉ là một hệ quả của cách ngữ pháp được viết trong tiêu chuẩn. Tôi không biết đây có phải là sự giám sát hay không.

Biểu thức lambda bắt đầu bằng trình giới thiệu lambda (dấu ngoặc vuông), tiếp theo là trình khai báo lambda tùy chọn.

Trình khai báo lambda chứa danh sách đối số, có thể thay đổi, thuộc tính, specifier ngoại lệ và kiểu trả về. Tất cả những điều này là tùy chọn, ngoại trừ danh sách đối số. Vì vậy, nếu một người khai báo lambda có mặt ở tất cả, các dấu ngoặc đơn phải ở đó.

Đây là lý do tại sao bạn không thể chỉ có từ khóa có thể thay đổi.

1

Tìm kiếm trong mục 5.1.2 [expr.prim.lambda] trong n4296 (đây là bản thảo cuối cùng C++ 14), đó chỉ là cách nó rơi ra khỏi ngữ pháp. mutable chỉ được phép trong một tuyên bố lambda lambda - bao gồm dấu ngoặc đơn. Toàn bộ lambda-khai báo là tùy chọn mặc dù (đó là lý do tại sao bạn có thể bỏ qua các dấu ngoặc).

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