2009-03-15 81 views

Trả lời

12

Từ bản sao của tôi n2798:

5.3.4 New

21 Cho dù chức năng phân bổ được gọi trước khi đánh giá các đối số nhà xây dựng hoặc sau khi đánh giá các nhà xây dựng các đối số nhưng trước khi nhập hàm tạo không được chỉ định. Nó cũng không xác định xem các đối số cho một hàm tạo có được đánh giá hay không nếu hàm phân bổ trả về con trỏ null hoặc thoát bằng cách sử dụng một ngoại lệ.

đọc kết hợp với (để tránh sự mơ hồ):

5.3.4 New

8 A mới thể hiện có được lưu trữ cho các đối tượng bằng cách gọi một chức năng phân bổ (3.7. 4.1). Nếu newexpression chấm dứt bằng cách ném một ngoại lệ, nó có thể giải phóng lưu trữ bằng cách gọi một hàm deallocation (3.7.4.2). Nếu loại được phân bổ là loại không phải mảng, tên của hàm phân bổ là toán tử mới và tên của hàm deallocation là toán tử xóa. Nếu loại được phân bổ là loại mảng, tên của chức năng phân bổ là toán tử mới [] và tên của hàm deallocation là toán tử delete []. [...]

Điều này trả lời khá nhiều câu hỏi. Câu trả lời là không'.

+0

Có, nó khá rõ ràng :) –

+0

Điều đó thật nhanh. Cảm ơn! –

+0

Tôi có đúng trong việc giải thích rằng không xác định để chỉ mở rộng đến chức năng phân bổ - các đối số được đánh giá đầy đủ trước khi hàm dựng đúng được gọi, phải không? –

1

++ tôi phải được thực hiện trước khi phân bổ VÀ gọi.

CHỈNH SỬA: (và tôi có thể đã trả lời một chút quá nhanh)

+0

Bạn có bất kỳ bằng chứng nào về điều này không? –

+0

Hmmm ... bây giờ tôi nghĩ về nó, nó tương đương với ((X *) malloc (sizeof (X))) -> X (++ i) bằng cách nào đó và tôi không chắc chắn nữa: /. Tôi đoán trình biên dịch "nên" làm cho nó tương đương với newFunction (++ i) nhưng tôi có thể đã trả lời một chút vội vàng. –

+0

Trong C, câu trả lời sẽ là có; có một điểm chuỗi trước một cuộc gọi hàm và tất cả các tác dụng phụ trong việc đánh giá đối số của nó phải được hoàn thành trước khi hàm được gọi. Tôi mong đợi tương tự để giữ trong C + +. –

2

Trong một từ, không.

Không có điểm chuỗi giữa "mới" và "++ i"

+0

bạn cũng đúng ..! – Warrior

4

Nhìn chung, trình biên dịch C++ là miễn phí để xếp lại thứ tự các thông số chức năng miễn là nó không làm thay đổi ý nghĩa.

Xem Martin trả lời ở đây: What are all the common undefined behaviours that a C++ programmer should know about?

Thực tế, có 2 chức năng cuộc gọi xảy ra ở đây dưới mui xe.

  1. điều hành mới
  2. gọi constructor cho X

Mặc dù đó là hai cuộc gọi riêng biệt, tôi không tin rằng có một điểm chuỗi giữa hai hoạt động này. Wikipedia xuất hiện để support this point. Do đó trình biên dịch được tự do sắp xếp lại đánh giá vì nó thấy phù hợp.

1

X mới (++ i)

Cú pháp để điều hành mới wrt C++ tiêu chuẩn:

[::] "mới" [ "(" biểu-list ")"] {kiểu mới -id | "(" Type-id ")"} [ "(" biểu-list ")"]

Vì vậy,

  1. bộ nhớ Phân bổ cho đối tượng X.
  2. Danh sách biểu sẽ đánh giá được thông qua vào hàm tạo của đối tượng được cấp phát.

vì vậy, chúng tôi có thể chắc chắn rằng, ++ tôi sẽ được đánh giá, trước khi hàm tạo của Object X được gọi.

Cheers ..

+0

Vâng, điều này sẽ cho bạn biết thứ tự nó sẽ được PARSED. Không phải thứ tự nó sẽ được thực thi. Mặc dù nó là nhất định ++ tôi sẽ được gọi trước khi constructore không có vấn đề gì). –

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