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; }
.
Nguồn
2012-05-30 11:07:42
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
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
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