2017-06-20 14 views
14

Tôi có câu hỏi về the different meanings of a curly-brace enclosed list.Tại sao GCC 6.3 biên dịch mã Braced-Init-List này mà không cần hỗ trợ C++ 11 rõ ràng?

Tôi biết rằng C++ 03 không hỗ trợ C232 11 initializer_list. Tuy nhiên, ngay cả khi không cờ -std=c++11 trình biên dịch, gcc 6.3 will properly initialize interpolate với mã này:

map<string, string> interpolate = { { "F", "a && b && c" }, { "H", "p^2 + w" }, { "K", "H > 10 || e < 5" }, { "J", "F && !K" } }; 

I was challenged về lý do tại sao điều này sẽ làm việc, và tôi nhận ra tôi không có một câu trả lời. Đây là một Brace-Init-List, nhưng cách chúng ta nhận được từ đó để khởi tạo một thùng chứa tiêu chuẩn thường thông qua một initializer_list. Vậy mã không phải C++ 11 sẽ hoàn thành việc khởi tạo như thế nào?

+2

Tôi khá ngạc nhiên khi câu hỏi này được đưa ra cho 'Câu hỏi về Câu hỏi Mạng Nóng': | Tôi nghĩ rằng điều này cũng được tài liệu của gcc và một số nơi trên internet về cờ biên dịch mặc định trong gcc mới – P0W

+1

@ P0W Tôi cũng hơi ngạc nhiên. Tại thời điểm tôi hỏi nó tôi giả định, tương tự như hành vi mặc định trong gcc 5, tôi đã sử dụng "-std = C++ 98". Tôi đoán rất nhiều người chỉ tình cờ gặp mặt người có cùng quan niệm trước. Đừng lo lắng, tôi chắc chắn nó chỉ là quang sai, tỷ lệ bỏ phiếu bình thường C++ sẽ sớm được khôi phục. –

Trả lời

33

default compiler command for gcc 6.x is -std=gnu++14, do đó trình biên dịch sẽ ngầm biên dịch mã của bạn bằng phiên bản sau của tiêu chuẩn ngôn ngữ C++.

Bạn sẽ cần phải chỉ định thủ công -std=c++03 nếu bạn muốn biên dịch trong C++ 03.

+18

Một câu hỏi thú vị hơn là tại sao mọi người mong đợi một trình biên dịch mới vẫn còn mặc định cho một tiêu chuẩn 14 tuổi! Dù sao, thực tế là 'g ++' 6 ngừng làm điều đó là một điều tuyệt vời, nhưng tôi muốn mặc định là' C++ 14', không có bất kỳ phần mở rộng nào; nếu không, mọi người có thể giả định rằng những gì 'g ++' cho phép theo mặc định được đảm bảo để được xác định rõ ràng, không phải như vậy. –

+3

Nó không phải là không hợp lý của một giả định như bạn làm cho nó ra được, @underscore_d. Có hai chiến lược cơ bản để lựa chọn mặc định: (A) biến chúng thành những gì bạn nghĩ là thường xuyên nhất mong muốn, hoặc (B) làm cho chúng trở nên an toàn nhất có thể. Nếu chiến lược (B) được sử dụng, thì việc mặc định thành C++ 03 sẽ có ý nghĩa tốt. Điều này cũng tạo điều kiện nâng cấp các cơ sở mã hiện có lên một phiên bản sau của trình biên dịch, mà chiến lược (A) sẽ làm phức tạp nghiêm trọng, giả sử như mọi mã được biên dịch với trình biên dịch đó là * mã mới *. Đồng ý hoàn toàn về việc không mặc định cho các phần mở rộng Gnu, mặc dù! –

+3

@CodyGray Đúng, điểm tốt. Thêm vào đó, kỳ vọng rằng tiêu chuẩn mặc định sẽ là ... cổ điển có tiền lệ: 'g ++' 5 vẫn được mặc định là _C++ 98_, các tính năng tốt của fer! –

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