2012-10-23 30 views
15

tôi đang viết một hàm template nhưXx (t ...) có thể dẫn đến khai báo hàm với phân tích cú pháp không?

template<typename ...T> 
void f(T ...t) { 
    X x(t...); 
    // ... 
} 

Khi tôi nhìn vào nó, tôi đã tự hỏi điều gì xảy ra cho một cuộc gọi f(). Sẽ phân tích cú pháp vexing làm cho x một tuyên bố chức năng? Trình biên dịch dường như biến nó thành một biến. Ai đó có thể giúp tôi chắc chắn về nó được không?

Trả lời

13

Dấu ngoặc đơn trống (()) sẽ chỉ làm cho nó trở thành khai báo hàm nếu được viết như vậy trong mã nguồn.

§14.5.3 [temp.variadic] p6 cũng đề cập đến điều này:

Các instantiation của một mở rộng gói đó không phải là một sizeof ... biểu hiện tạo ra một danh sách E1, E2, ..., EN, trong đó N là số phần tử trong các thông số mở rộng gói. [...] Khi N bằng 0, sự khởi tạo của việc mở rộng tạo ra một danh sách trống. Sự diễn giải như vậy không làm thay đổi cách diễn giải cú pháp của cấu trúc kèm theo, ngay cả trong trường hợp bỏ qua danh sách hoàn toàn nếu không sẽ bị hình thành hoặc sẽ dẫn đến sự mơ hồ trong ngữ pháp. [Ví dụ:

template<class... T> struct X : T... { }; 
template<class... T> void f(T... values) { 
X<T...> x(values...); 
} 
template void f<>(); // OK: X<> has no base classes 
        // x is a variable of type X<> that is value-initialized 

-end dụ]

Xem đặc biệt là bình luận thứ hai trong các mã ví dụ.

+0

ohh sao tôi có thể bỏ lỡ điều đó! cảm ơn :-) –

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