là gì sự khác biệt giữa Object obj (args ...) và đối tượng obj {args ...}? và tại sao Scott nói vậy.
Sự khác biệt là trong trường hợp trước, thứ tự đánh giá đối số không được xác định (nghĩa là không xác định) nhưng trong trường hợp thứ hai, thứ tự từ trái sang phải (nghĩa là chúng xuất hiện).
Các văn bản sau đây từ $ 5.2.2/8 [expr.call] (n3690) giao dịch với Object(args...)
dạng:
Các đánh giá của biểu thức postfix và của các đối số đều unsequenced liên quan đến một khác. Tất cả các tác dụng phụ của việc đánh giá đối số được giải trình tự trước khi hàm được nhập (xem 1.9).
Và văn bản từ $ 8.5.4/4 [dcl.init.list] (n3690) giao dịch với Object{args...}
dạng:
Trong initializer-list của một chuẩn bị tinh thần-init-danh sách, điều khoản khởi tạo, bao gồm bất kỳ kết quả nào từ mở rộng gói (14.5.3), là được đánh giá theo thứ tự xuất hiện. Tức là, mọi tính toán giá trị và mệnh đề phụ được kết hợp với mệnh đề khởi tạo cho trước được tính toán trước mỗi lần tính toán giá trị và e ff ect liên kết với bất kỳ mệnh đề khởi tạo nào theo sau trong danh sách được phân tách bằng dấu phẩy. [Lưu ý: các yêu cầu đặt hàng đánh giá bất kể ngữ nghĩa của việc khởi tạo ; ví dụ, nó áp dụng khi các phần tử của danh sách khởi tạo được hiểu là đối số của lệnh gọi hàm dựng, mặc dù thông thường không có ràng buộc trình tự trên các đối số của cuộc gọi.- cuối note]
Vâng điều đó có nghĩa này:
int f() { static int i = 10; return ++i; } //increment the static int!
Object obj(f(), f()); //is it obj(11,12) or obj(12,11)? Unspecified.
Object obj{f(), f()}; //it is obj(11,12). Guaranteed.
Lưu ý rằng GCC (4.7.0 and 4.7.2) have a bug because of which {}
form doesn't work the way it should. Tôi không chắc chắn nếu nó được cố định trong phiên bản hiện tại.
Hy vọng điều đó sẽ hữu ích.
thể trùng lặp của [Làm thế nào để sử dụng C++ 11 cú pháp khởi tạo thống nhất?] (Http://stackoverflow.com/questions/7612075/how-to-use-c11-uniform-initialization-syntax) –
@MattMcNabb, câu hỏi đó yêu cầu CÁCH, câu hỏi này yêu cầu TẠI SAO. – xmllmx
Câu hỏi này không hỏi "TẠI SAO", và câu hỏi khác bao gồm khởi tạo thống nhất nào. –