2013-09-21 55 views
11

AFAIK, các sizeof không nên trở 0, nhưng chương trình sau:kích thước của lớp với mảng sản phẩm nào trong C++

#include <iostream> 

class A { 
public: 
    int a[0]; 
}; 

int main() { 
    A obj; 
    std::cout << sizeof(obj) << std::endl; 
} 

đầu ra 0. Tại sao?

+0

Tại sao bạn mong đợi nó không phải là '0'? – BartoszKP

+6

@BartoszKP Vì tiêu chuẩn C++ cấm nó. –

+1

@Dukeling Không, mã là bất hợp pháp C++ anyway. –

Trả lời

13

C++ không cho phép các mảng có kích thước bằng không. Trình biên dịch tuân thủ từ chối mã, ví dụ:

$ g++-4.8 -pedantic-errors main.cpp 
main.cpp:5:14: error: ISO C++ forbids zero-size array 'a' [-Wpedantic] 
     int a[0]; 
      ^

Vì vậy, hành vi của sizeof ở đây đơn giản là không liên quan. GCC cho phép (không có -pedantic) dưới dạng compiler extension.

+1

+1: Điều này có thể được tìm thấy trong 8.3.4§1: * "Trong khai báo' TD [biểu thức không đổi] '[..] biểu thức hằng số (5.19) là hiện tại, nó phải là biểu thức hằng số không thể tách rời và giá trị của nó phải lớn hơn không "*. – Zeta

+0

Kích thước của một đối tượng của lớp này trong GCC là gì? Tôi cho rằng kích thước của con trỏ. nó là gì? – hasan83

+0

@hasan Không có điểm nào trong việc thảo luận về việc triển khai bị lỗi nên trả lại trong trường hợp này. Kích thước của mảng không được là 0 –