2012-05-30 21 views
12

Công trình sau đây có ý nghĩa gì?Ví dụ mẫu C++ variadic Ví dụ bất thường

#include <iostream> 

template <int ...> struct s; 

int main() { 
    int i = s<,>::xxx; 

    std::cout << i << std::endl; 
} 

Được biên soạn bởi gcc 4.4.5+ và khi kết quả được thực hiện 0.

+0

Nó xuất ra một số giá trị ngẫu nhiên trên máy của tôi. Việc khởi tạo 'i' bằng cách nào đó bị bỏ qua và giá trị đơn vị hóa của' i' được in. – jrok

+5

Trông không hợp pháp. 's' không bao giờ được định nghĩa (và không chứa thành viên' xxx') và các khuôn mẫu phải được cung cấp các tham số không trống. (Tôi đã biên dịch nó với gcc 4.6.2 và nó được in ra '32767', clang sẽ không biên dịch nó). – Mankarse

+0

Thay đổi tên 's' hoặc' xxx' không thay đổi hành vi. Điều này gần như chắc chắn là một lỗi trong gcc. Dường như lỗi được kích hoạt bằng cách cung cấp các đối số trống cho mẫu variadic. – Mankarse

Trả lời

13

Tôi viết lại chương trình này:

template <int ...> struct s; 

int main() { 
    int i = s<,>::xxx; 

    return i; 
} 

và biên dịch nó với -S -switch, để có được sản lượng lắp ráp mà tôi dọn dẹp như sau:

main: 
     pushq %rbp 
     movq %rsp, %rbp 
     movl -4(%rbp), %eax 
     popq %rbp 
     ret 

Bây giờ, asm của tôi là một chút gỉ, nhưng mã quan trọng duy nhất có vẻ là movl -4(%rbp), %eax, trong đó đặt giá trị trả lại cho bất cứ điều gì nó có thể đọc từ i. Nói cách khác, chương trình đơn giản trả về bất cứ thứ gì nằm trên chồng khi chức năng main được nhập vào. Điều này dường như chứng thực nhận xét của @ jrok rằng việc khởi tạo i bằng cách nào đó bị bỏ qua. Không có mã đã được tạo ra cho sự huyền bí s<,>::xxx -expression.

Tóm lại; điều này trông giống như một lỗi trình biên dịch. Trình biên dịch nên đã đưa ra một thông báo lỗi.

Lưu ý bên cạnh: Tôi nhận được đầu ra lắp ráp giống hệt nhau cho chương trình int main() { int i; return i; }.

+0

Trích khấu trừ. :) – Dennis