2012-07-03 85 views
21

Trong [dcl.attr.depend]/1, tôi đọc:Trong C++ 11, làm cách nào để xác định rằng tham số ngầm định "this" "[[carry_dependency]]"?

Thuộc tính [...] carries_dependency [...] có thể được áp dụng cho declarator-id của một parameter-declaration trong một tuyên bố chức năng hoặc lambda, trong trường hợp đó, nó chỉ ra rằng việc khởi tạo tham số mang phụ thuộc vào (1.10) mỗi chuyển đổi từ rvalue-to-rvalue (4.1) của đối tượng đó. Thuộc tính cũng có thể được áp dụng cho các declarator-id của một tuyên bố chức năng , trong trường hợp nó xác định rằng giá trị trả về, nếu có, mang một sự phụ thuộc vào việc đánh giá biểu thức cuộc gọi hàm.

Điều tôi thiếu là cách áp dụng thuộc tính cho tham số ngụ ý this.

Bằng một ví dụ, hãy xem xét chức năng miễn phí này:

void fun(int i, Foo * [[carries_dependency]] f); 

và nó tương đương (nhưng đối với các thuộc tính) phiên bản thành viên:

void Foo::fun(int i); // can't add [[carries_dependency]] here? 
+1

Tôi khá chắc chắn rằng nó có thể được thực hiện, nhưng bạn sẽ phải xem cú pháp trong tiêu chuẩn. Tôi có thể đoán rằng nó sẽ giống như '[[mang_dependency]] void fun (int);' hoặc 'void fun (int) [[mang_dependency]];' trong khai báo. –

+0

@David Rodríguez - dribeas Nếu tôi đọc đúng ngữ pháp, trước đây áp dụng thuộc tính cho giá trị trả về của hàm (nếu có) trong khi hàm sau không được phép. –

+0

@MarkB: 8.4.1p2 dường như chỉ ra rằng các thuộc tính hàm là các phần tử cuối cùng trong khai báo hàm. –

Trả lời

3

Tôi không chắc chắn và không có một trình biên dịch với sự hỗ trợ cho điều này để kiểm tra, nhưng đây là một swing tại một khả năng: Tôi nghĩ rằng ngữ pháp [gram.decl] chỉ ra rằng bạn sẽ có thể đặt nó ("thuộc tính-specifier_opt") trong cùng một vị trí bạn muốn đặt " const "để biểu thị con trỏ này liên tục (" cv-qualifier-seq_opt "), điều này sẽ có ý nghĩa:

parameters-and-qualifiers: 
    (parameter-declaration-clause) attribute-specifier_opt cv-qualifier-seq_opt 
     ref-qualifier_opt exception-specification_opt 

Ví dụ:

struct X{ 
    void f(int i) [[carries_dependency]]; 
}; 
+0

Thay vì không ngạc nhiên, khi so sánh với 'const' thành viên,' = mặc định' vv – sehe

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