2012-06-20 37 views
19

thể trùng lặp:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?constructor mặc định cho int

Trong một câu trả lời cho this question nó nói rằng

ints là mặc định-xây dựng là 0, vì nếu bạn khởi tạo chúng bằng int(). Các kiểu nguyên thủy khác được khởi tạo tương tự (ví dụ: double(), long(), bool(), v.v.).

Ngay khi tôi đang giải thích điều này cho đồng nghiệp của tôi, tôi đã tạo mã sau đây, compiled (gcc-4.3.4) and ran và đã quan sát hành vi không mong muốn.

#include <iostream> 

int main() { 
    int i(); 
    std::cout << i << std::endl; // output is 1 
} 

Tại sao đầu ra 1 nhưng 0?

+1

này được giải thích: [Tại sao nó lỗi sử dụng một tập rỗng của dấu ngoặc để gọi một constructor không có đối số?] (Http: //stackoverflow.com/questions/180172/why-is-it-an-error-to-use-an-empty-set-of-brackets-to-call-a-constructor-with-no) –

+1

Tôi ngạc nhiên khi nó biên dịch, vì có vẻ như bạn tình cờ gặp [phân tích cú pháp khó chịu nhất] (http://en.wikipedia.org/wiki/Most_vexing_parse). –

+1

Chúc mừng bạn đã khám phá [phân tích cú pháp gây tranh cãi nhất] (http://en.wikipedia.org/wiki/Most_vexing_parse). – dasblinkenlight

Trả lời

27

Phân tích cú pháp gây tranh cãi nhất được phát tại đây. Bạn đang thực sự khai báo hàm i, không phải là biến số int. Nó thậm chí không nên biên dịch (trừ khi bạn thực sự có một hàm i được định nghĩa ở đâu đó ... bạn?).

Để giá trị khởi tạo int, bạn cần:

int i = int(); 
+1

Trích xuất ngầm thành 'bool', tôi nghĩ vậy. – aschepler

+0

Nó phải là lỗi trong các phiên bản trước của GCC; trong 4.7, nó không biên dịch. – Griwes

+0

@Griwes có thể anh ta định nghĩa chức năng ở đâu đó và không ý thức được nó. –

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